From b535f429636bd183930ee5a500c0b53f006778af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 7 Nov 2025 16:30:47 +0300 Subject: [PATCH] Introduce IResourcePermissionChecker --- .../Resources/IResourcePermissionChecker.cs | 23 ++++++++ .../ResourcePermissionCheckerExtensions.cs | 58 +++++++++++++++++++ .../Volo.Abp.Ddd.Domain.csproj | 1 + ...tityResourcePermissionCheckerExtensions.cs | 56 ++++++++++++++++++ .../Volo/Abp/Domain/AbpDddDomainModule.cs | 4 +- 5 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/Resources/IResourcePermissionChecker.cs create mode 100644 framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/Resources/ResourcePermissionCheckerExtensions.cs create mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/EntityResourcePermissionCheckerExtensions.cs diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/Resources/IResourcePermissionChecker.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/Resources/IResourcePermissionChecker.cs new file mode 100644 index 0000000000..0bf3b23389 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/Resources/IResourcePermissionChecker.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Volo.Abp.Authorization.Permissions.Resources; + +public interface IResourcePermissionChecker +{ + Task IsGrantedAsync( + string permissionName, + string resourceName, + string resourceKey + ); + + Task> GetPermissionsAsync( + string resourceName, + string resourceKey + ); + + Task GetGrantedPermissionsAsync( + string resourceName, + string resourceKey + ); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/Resources/ResourcePermissionCheckerExtensions.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/Resources/ResourcePermissionCheckerExtensions.cs new file mode 100644 index 0000000000..c294b7d75c --- /dev/null +++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/Resources/ResourcePermissionCheckerExtensions.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Volo.Abp.Authorization.Permissions.Resources; + +public static class ResourcePermissionCheckerExtensions +{ + public static Task IsGrantedAsync( + this IResourcePermissionChecker resourcePermissionChecker, + string permissionName, + TResource resource, + object resourceKey + ) + { + Check.NotNull(resourcePermissionChecker, nameof(resourcePermissionChecker)); + Check.NotNullOrWhiteSpace(permissionName, nameof(permissionName)); + Check.NotNull(resource, nameof(resource)); + Check.NotNull(resourceKey, nameof(resourceKey)); + + return resourcePermissionChecker.IsGrantedAsync( + permissionName, + typeof(TResource).FullName!, + resourceKey.ToString()! + ); + } + + public static Task> GetPermissionsAsync( + this IResourcePermissionChecker resourcePermissionChecker, + TResource resource, + object resourceKey + ) + { + Check.NotNull(resourcePermissionChecker, nameof(resourcePermissionChecker)); + Check.NotNull(resource, nameof(resource)); + Check.NotNull(resourceKey, nameof(resourceKey)); + + return resourcePermissionChecker.GetPermissionsAsync( + typeof(TResource).FullName!, + resourceKey.ToString()! + ); + } + + public static Task GetGrantedPermissionsAsync( + this IResourcePermissionChecker resourcePermissionChecker, + TResource resource, + object resourceKey + ) + { + Check.NotNull(resourcePermissionChecker, nameof(resourcePermissionChecker)); + Check.NotNull(resource, nameof(resource)); + Check.NotNull(resourceKey, nameof(resourceKey)); + + return resourcePermissionChecker.GetGrantedPermissionsAsync( + typeof(TResource).FullName!, + resourceKey.ToString()! + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.csproj b/framework/src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.csproj index 6506d8fe7b..8666c1faa2 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.csproj +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.csproj @@ -17,6 +17,7 @@ + diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/EntityResourcePermissionCheckerExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/EntityResourcePermissionCheckerExtensions.cs new file mode 100644 index 0000000000..810c6eade2 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/EntityResourcePermissionCheckerExtensions.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.Authorization.Permissions.Resources; + +public static class EntityResourcePermissionCheckerExtensions +{ + public static Task IsGrantedAsync( + this IResourcePermissionChecker resourcePermissionChecker, + string permissionName, + TEntity entity + ) + where TEntity : class, IEntity + { + Check.NotNull(resourcePermissionChecker, nameof(resourcePermissionChecker)); + Check.NotNullOrWhiteSpace(permissionName, nameof(permissionName)); + Check.NotNull(entity, nameof(entity)); + + return resourcePermissionChecker.IsGrantedAsync( + permissionName, + typeof(TEntity).FullName!, + entity.GetKeys().JoinAsString(",") + ); + } + + public static Task> GetPermissionsAsync( + this IResourcePermissionChecker resourcePermissionChecker, + TEntity entity + ) + where TEntity : class, IEntity + { + Check.NotNull(resourcePermissionChecker, nameof(resourcePermissionChecker)); + Check.NotNull(entity, nameof(entity)); + + return resourcePermissionChecker.GetPermissionsAsync( + typeof(TEntity).FullName!, + entity.GetKeys().JoinAsString(",") + ); + } + + public static Task GetGrantedPermissionsAsync( + this IResourcePermissionChecker resourcePermissionChecker, + TEntity entity + ) + where TEntity : class, IEntity + { + Check.NotNull(resourcePermissionChecker, nameof(resourcePermissionChecker)); + Check.NotNull(entity, nameof(entity)); + + return resourcePermissionChecker.GetGrantedPermissionsAsync( + typeof(TEntity).FullName!, + entity.GetKeys().JoinAsString(",") + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs index de6632704d..cf3ba5fea8 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Auditing; +using Volo.Abp.Authorization; using Volo.Abp.Caching; using Volo.Abp.Data; using Volo.Abp.Domain.ChangeTracking; @@ -24,7 +25,8 @@ namespace Volo.Abp.Domain; typeof(AbpExceptionHandlingModule), typeof(AbpSpecificationsModule), typeof(AbpCachingModule), - typeof(AbpDddDomainSharedModule) + typeof(AbpDddDomainSharedModule), + typeof(AbpAuthorizationAbstractionsModule) )] public class AbpDddDomainModule : AbpModule {