网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
namespace Dpz.Core.WebApi.Middleware;

/// <summary>
/// 权限策略
/// </summary>
public class PermissionRequirement
    : AuthorizationHandler<PermissionRequirement>,
        IAuthorizationRequirement
{
    private readonly Permissions _permission;

    /// <summary>
    /// ctor
    /// </summary>
    /// <param name="permission"></param>
    public PermissionRequirement(Permissions permission)
    {
        _permission = permission;
    }

    /// <summary>
    /// 处理权限
    /// </summary>
    /// <param name="context"></param>
    /// <param name="requirement"></param>
    /// <returns></returns>
    /// <exception cref="System.NotImplementedException"></exception>
    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context,
        PermissionRequirement requirement
    )
    {
        context.User.GetIdentity();
        if (!context.User.HasClaim(x => x.Type == "Permissions"))
        {
            context.Fail();
            return Task.CompletedTask;
        }
        var permissionValue = context.User.FindFirst(x => x.Type == "Permissions")?.Value;
        if (
            string.IsNullOrEmpty(permissionValue)
            || !Enum.TryParse(typeof(Permissions), permissionValue, out var permission)
        )
        {
            context.Fail();
            return Task.CompletedTask;
        }
        var userFlags = permission?.ToString()?.Split(",")?.Select(x => x.Trim())?.ToList();
        var flags = _permission.ToString().Split(",").Select(x => x.Trim()).ToList();
        if (flags.Any(flag => userFlags != null && !userFlags.Contains(flag)))
        {
            context.Fail();
            return Task.CompletedTask;
        }
        context.Succeed(requirement);
        return Task.CompletedTask;
    }
}

internal static class ApiPermission
{
    /// <summary>
    /// 系统最高权限
    /// </summary>
    public const string System = "System";
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一个权限策略的实现,主要用于在 ASP.NET Core Web API 中进行权限验证。以下是代码的主要组成部分和功能解释:

1. PermissionRequirement

  • 这个类实现了 IAuthorizationRequirement 接口,并继承自 AuthorizationHandler<PermissionRequirement>,用于处理特定的权限要求。
  • 它的构造函数接受一个 Permissions 类型的参数,表示所需的权限。

2. HandleRequirementAsync 方法

  • 这是权限处理的核心方法,负责验证用户是否具备所需的权限。
  • 方法的参数包括 AuthorizationHandlerContextPermissionRequirement,前者包含了当前的授权上下文,后者是当前的权限要求。

3. 权限验证逻辑

  • 检查用户是否有权限声明:首先,代码检查用户是否有名为 "Permissions" 的声明。如果没有,调用 context.Fail() 方法表示授权失败。
  • 获取权限值:如果用户有权限声明,代码尝试获取该声明的值,并将其解析为 Permissions 枚举类型。如果解析失败或值为空,调用 context.Fail()
  • 比较权限:将用户的权限值分割成一个列表,并与所需的权限进行比较。如果用户的权限列表中不包含所需的任何权限,调用 context.Fail()
  • 成功授权:如果用户具备所需的权限,调用 context.Succeed(requirement) 表示授权成功。

4. ApiPermission

  • 这是一个内部静态类,定义了一些常量权限值。在这个例子中,定义了一个名为 System 的常量,表示系统最高权限。

总结

整体上,这段代码实现了一个自定义的权限验证机制,允许开发者在 Web API 中根据用户的权限声明来控制访问。通过实现 IAuthorizationRequirement 接口和重写 HandleRequirementAsync 方法,开发者可以灵活地定义和检查用户的权限。

loading