React+.Net角色权限控制(未完成)



项目地址

  • 教程作者:
  • 教程地址:
  • 代码仓库地址:
  • 所用到的框架和插件:
dbt 
airflow

一、代码示例

1.1 后端

1. 权限实体和权限DTO

  1. 权限实体
    在这里插入图片描述
  2. DTO

在这里插入图片描述

2. 实现授权接口

在这里插入图片描述

  • 实现接口
public class PermissionService : IPermissionService
{
   
   
    private readonly AppDbContext _dbContext;

    public PermissionService(AppDbContext dbContext)
    {
   
   
        _dbContext = dbContext;
    }

    // 核心:合并用户的角色权限和单独权限(去重)
    public async Task<List<PermissionDto>> GetUserPermissionsAsync(int userId)
    {
   
   
        // 1. 获取用户所属角色的权限
        var rolePermissions = await _dbContext.UserRoles
            .Where(ur => ur.UserId == userId)
            .Join(_dbContext.RolePermissions, 
                ur => ur.RoleId, 
                rp => rp.RoleId, 
                (ur, rp) => rp.PermissionId)
            .Distinct()
            .ToListAsync();

        // 2. 获取用户单独分配的权限
        var userPermissions = await _dbContext.UserPermissions
            .Where(up => up.UserId == userId)
            .Select(up => up.PermissionId)
            .Distinct()
            .ToListAsync();

        // 3. 合并权限(角色权限 + 用户单独权限,去重)
        var allPermissionIds = rolePermissions.Union(userPermissions).ToList();

        // 4. 查询权限详情
        return await _dbContext.Permissions
            .Where(p => allPermissionIds.Contains(p.PermissionId))
            .Select(p => new PermissionDto
            {
   
   
                PermissionId = p.PermissionId,
                PermissionCode = p.PermissionCode,
                PermissionName = p.PermissionName,
                MenuId = p.MenuId
            })
            .ToListAsync();
    }

    // 获取用户可访问的菜单(含按钮权限)
    public async Task<List<MenuPermissionDto>> GetUserMenusAsync(int userId)
    {
   
   
        // 1. 获取用户所有权限
        var userPermissions = await GetUserPermissionsAsync(userId);
        var permissionCodes = userPermissions.Select(p => p.PermissionCode).ToList();

        // 2. 获取所有菜单,筛选出用户有权访问的(菜单权限码格式:"menu:menuId")
        var accessibleMenuIds = userPermissions
            .Where(p => p.MenuId.HasValue && p.PermissionCode.StartsWith("menu:"))
            .Select(p => p.MenuId.Value)
            .Distinct()
            .ToList();

        // 3. 构建菜单树(含子菜单和按钮权限)
        var allMenus = await _dbContext.Menus.ToListAsync();
        var accessibleMenus = allMenus
            .Where(m => accessibleMenuIds.Contains(m.MenuId))
            .ToList();

        // 4. 递归构建菜单树
        var menuDtos = BuildMenuTree(accessibleMenus, null, userPermissions);
        return menuDtos
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值