Browse Source

Make EntityResourcePermissionRequirementHandler

pull/24374/head
Halil İbrahim Kalkan 10 months ago
parent
commit
7500ec5490
  1. 4
      framework/src/Volo.Abp.Ddd.Domain/Microsoft/Extensions/DependencyInjection/EntityResourcePermissionAuthorizationExtensions.cs
  2. 19
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/EntityExtensions.cs
  3. 30
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/EntityResourcePermissionRequirementHandler.cs
  4. 19
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/KeyedObjectResourcePermissionCheckerExtensions.cs
  5. 34
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/KeyedObjectResourcePermissionRequirementHandler.cs
  6. 18
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/KeyedObjectResourcePermissionStoreExtensions.cs
  7. 2
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs

4
framework/src/Volo.Abp.Ddd.Domain/Microsoft/Extensions/DependencyInjection/EntityResourcePermissionAuthorizationExtensions.cs

@ -5,9 +5,9 @@ namespace Microsoft.Extensions.DependencyInjection;
public static class ResourcePermissionExtenstions
{
public static IServiceCollection AddEntityResourcePermissionAuthorization(this IServiceCollection services)
public static IServiceCollection AddKeyedObjectResourcePermissionAuthorization(this IServiceCollection services)
{
services.AddSingleton<IAuthorizationHandler, EntityResourcePermissionRequirementHandler>();
services.AddSingleton<IAuthorizationHandler, KeyedObjectResourcePermissionRequirementHandler>();
return services;
}
}

19
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/EntityExtensions.cs

@ -1,19 +0,0 @@
using System.Collections.Generic;
using Volo.Abp.Domain.Entities;
namespace Volo.Abp.Authorization.Permissions.Resources;
public static class EntityExtensions
{
public static string GetResourceName(this IEntity entity)
{
Check.NotNull(entity, nameof(entity));
return entity.GetType().FullName!;
}
public static string GetResourceKey(this IEntity entity)
{
Check.NotNull(entity, nameof(entity));
return entity.GetKeys().JoinAsString(",");
}
}

30
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/EntityResourcePermissionRequirementHandler.cs

@ -1,30 +0,0 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Domain.Entities;
namespace Volo.Abp.Authorization.Permissions.Resources;
public class EntityResourcePermissionRequirementHandler : AuthorizationHandler<ResourcePermissionRequirement, IEntity>
{
protected readonly IResourcePermissionChecker PermissionChecker;
public EntityResourcePermissionRequirementHandler(IResourcePermissionChecker permissionChecker)
{
PermissionChecker = permissionChecker;
}
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, ResourcePermissionRequirement requirement, IEntity? resource)
{
if (resource == null)
{
return;
}
var resourceName = resource.GetResourceName();
var resourceKey = resource.GetResourceKey();
if (await PermissionChecker.IsGrantedAsync(context.User, requirement.PermissionName, resourceName, resourceKey))
{
context.Succeed(requirement);
}
}
}

19
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/EntityResourcePermissionCheckerExtensions.cs → framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/KeyedObjectResourcePermissionCheckerExtensions.cs

@ -1,29 +1,28 @@
using System.Threading.Tasks;
using Volo.Abp.Domain.Entities;
namespace Volo.Abp.Authorization.Permissions.Resources;
public static class EntityResourcePermissionCheckerExtensions
public static class KeyedObjectResourcePermissionCheckerExtensions
{
/// <summary>
/// Checks if the specified permission is granted for the given entity.
/// Checks if the specified permission is granted for the given resource.
/// </summary>
/// <typeparam name="TEntity">The type of the entity.</typeparam>
/// <typeparam name="TResource">The type of the object.</typeparam>
/// <param name="resourcePermissionChecker">The resource permission checker instance.</param>
/// <param name="permissionName">The name of the permission to check.</param>
/// <param name="entity">The entity for which the permission is being checked.</param>
/// <param name="resource">The resource for which the permission is being checked.</param>
/// <returns>A task that represents the asynchronous operation. The task result is a boolean indicating whether the permission is granted.</returns>
public static Task<bool> IsGrantedAsync<TEntity>(this IResourcePermissionChecker resourcePermissionChecker, string permissionName, TEntity entity)
where TEntity : class, IEntity
public static Task<bool> IsGrantedAsync<TResource>(this IResourcePermissionChecker resourcePermissionChecker, string permissionName, TResource resource)
where TResource : class, IKeyedObject
{
Check.NotNull(resourcePermissionChecker, nameof(resourcePermissionChecker));
Check.NotNullOrWhiteSpace(permissionName, nameof(permissionName));
Check.NotNull(entity, nameof(entity));
Check.NotNull(resource, nameof(resource));
return resourcePermissionChecker.IsGrantedAsync(
permissionName,
entity,
entity.GetResourceKey()
resource,
resource.GetObjectKey() ?? throw new AbpException("The resource doesn't have a key.")
);
}
}

34
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/KeyedObjectResourcePermissionRequirementHandler.cs

@ -0,0 +1,34 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
namespace Volo.Abp.Authorization.Permissions.Resources;
public class KeyedObjectResourcePermissionRequirementHandler : AuthorizationHandler<ResourcePermissionRequirement, IKeyedObject>
{
protected readonly IResourcePermissionChecker PermissionChecker;
public KeyedObjectResourcePermissionRequirementHandler(
IResourcePermissionChecker permissionChecker)
{
PermissionChecker = permissionChecker;
}
protected override async Task HandleRequirementAsync(
AuthorizationHandlerContext context,
ResourcePermissionRequirement requirement,
IKeyedObject? resource)
{
if (resource == null)
{
return;
}
var resourceName = resource.GetType().FullName!;
var resourceKey = resource.GetObjectKey() ?? throw new AbpException("The resource doesn't have a key.");
if (await PermissionChecker.IsGrantedAsync(context.User, requirement.PermissionName, resourceName, resourceKey))
{
context.Succeed(requirement);
}
}
}

18
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/EntityResourcePermissionStoreExtensions.cs → framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Authorization/Permissions/Resources/KeyedObjectResourcePermissionStoreExtensions.cs

@ -5,25 +5,25 @@ using Volo.Abp.Domain.Entities;
namespace Volo.Abp.Authorization.Permissions.Resources;
public static class EntityResourcePermissionStoreExtensions
public static class KeyedObjectResourcePermissionStoreExtensions
{
/// <summary>
/// Retrieves an array of granted permissions for a specific entity.
/// </summary>
/// <typeparam name="TEntity">The type of the entity.</typeparam>
/// <typeparam name="TResource">The type of the resource.</typeparam>
/// <param name="resourcePermissionStore">The resource permission store instance.</param>
/// <param name="entity">The entity for which the permissions are being checked.</param>
/// <param name="resource">The resource for which the permissions are being checked.</param>
/// <returns>An array of granted permission names as strings.</returns>
public static async Task<string[]> GetGrantedPermissionsAsync<TEntity>(
public static async Task<string[]> GetGrantedPermissionsAsync<TResource>(
this IResourcePermissionStore resourcePermissionStore,
TEntity entity
TResource resource
)
where TEntity : class, IEntity
where TResource : class, IEntity
{
Check.NotNull(resourcePermissionStore, nameof(resourcePermissionStore));
Check.NotNull(entity, nameof(entity));
Check.NotNull(resource, nameof(resource));
return (await GetPermissionsAsync(resourcePermissionStore, entity)).Where(x => x.Value).Select(x => x.Key).ToArray();
return (await GetPermissionsAsync(resourcePermissionStore, resource)).Where(x => x.Value).Select(x => x.Key).ToArray();
}
/// <summary>
@ -44,7 +44,7 @@ public static class EntityResourcePermissionStoreExtensions
return await resourcePermissionStore.GetPermissionsAsync(
entity,
entity.GetResourceKey()
entity.GetObjectKey() ?? throw new AbpException("The entity doesn't have a key.")
);
}
}

2
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs

@ -38,6 +38,6 @@ public class AbpDddDomainModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddEntityResourcePermissionAuthorization();
context.Services.AddKeyedObjectResourcePermissionAuthorization();
}
}

Loading…
Cancel
Save