ReportsRoleHelper.cs 2.36 KB
using Volo.Abp.Users;
using Yi.Framework.Rbac.Domain.Shared.Consts;

namespace FoodLabeling.Application.Helpers;

/// <summary>
/// Reports 模块角色判断(与 JWT 中角色声明一致)
/// </summary>
public static class ReportsRoleHelper
{
    /// <summary>
    /// 是否为「可查看全部用户打印数据」的管理员:
    /// <list type="bullet">
    /// <item>标准 <see cref="ICurrentUser.Roles"/> 中含角色码 <c>admin</c>(普通账号绑定 RoleCode=admin 时走此路径);</item>
    /// <item>内置超管:用户名 <c>admin</c> 时 JWT 使用自定义 claim <c>Roles</c>,不写多条 <c>role</c>,需单独识别;</item>
    /// <item>超管权限 claim <c>Permission</c> 为 <c>*:*:*</c> 时视为管理员。</item>
    /// </list>
    /// </summary>
    public static bool IsAdminRole(ICurrentUser currentUser)
    {
        if (currentUser.Id is null)
        {
            return false;
        }

        var userName = currentUser.UserName?.Trim();
        if (!string.IsNullOrWhiteSpace(userName) &&
            string.Equals(userName, UserConst.Admin, StringComparison.OrdinalIgnoreCase))
        {
            return true;
        }

        foreach (var c in currentUser.FindClaims(TokenTypeConst.Permission))
        {
            if (!string.IsNullOrWhiteSpace(c.Value) &&
                string.Equals(c.Value.Trim(), UserConst.AdminPermissionCode, StringComparison.Ordinal))
            {
                return true;
            }
        }

        var rolesClaim = currentUser.FindClaims(TokenTypeConst.Roles).Select(x => x.Value).FirstOrDefault();
        if (!string.IsNullOrWhiteSpace(rolesClaim))
        {
            foreach (var part in rolesClaim.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
            {
                if (string.Equals(part, UserConst.AdminRolesCode, StringComparison.OrdinalIgnoreCase))
                {
                    return true;
                }
            }
        }

        if (currentUser.Roles is not null)
        {
            foreach (var r in currentUser.Roles)
            {
                if (!string.IsNullOrWhiteSpace(r) &&
                    string.Equals(r.Trim(), UserConst.AdminRolesCode, StringComparison.OrdinalIgnoreCase))
                {
                    return true;
                }
            }
        }

        return false;
    }
}