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 {