RBAC(基于角色的访问控制)模型的权限管理系统,使用.NET 10.0 + Blazor + FreeSql架构
整体流程图如下:

RoleMenuEntity中间表的作用
预期作用:
-
建立多对多关系:在角色(RoleEntity)和菜单(MenuEntity)之间建立多对多关联
-
权限控制:记录哪些角色可以访问哪些菜单
-
数据解耦:将角色和菜单的关联关系独立存储
RoleMenuEntity数据表现说明
📊 数据结构示例
假设我们有:
-
角色表 (RoleEntity):角色1(ID=1,RoleName="管理员")
-
菜单表 (MenuEntity):菜单ID从1到9
-
关系表 (RoleMenuEntity):记录角色1对应的9个菜单权限
var roleMenus = db.RoleMenuEntity .Where(rm => rm.RoleId == 1) .Include(rm => rm.Menu) .ToList(); // 结果:返回9条记录,每条记录包含Menu导航属性
📋 RoleMenuEntity表中会创建9条记录:
| RoleId | MenuId | 说明 |
|---|---|---|
| 1 | 1 | 角色1有菜单1的权限 |
| 1 | 2 | 角色1有菜单2的权限 |
| 1 | 3 | 角色1有菜单3的权限 |
| 1 | 4 | 角色1有菜单4的权限 |
| 1 | 5 | 角色1有菜单5的权限 |
| 1 | 6 | 角色1有菜单6的权限 |
| 1 | 7 | 角色1有菜单7的权限 |
| 1 | 8 | 角色1有菜单8的权限 |
| 1 | 9 | 角色1有菜单9的权限 |
[Description("菜单表")] // 菜单-角色:多对多关系(通过RoleMenuEntity中间表) public class MenuEntity: BaseEntity<MenuEntity,int> { [Description("菜单名")] public string? MenuName { get; set; } [Description("URL")] public string? Url { get; set; } [Description("图标")] public string? Icon { get; set; } public int ParentId { get; set; } // 自引用关系:父子菜单 [Navigate(nameof(ParentId))] public MenuEntity? Parent { get; set; } // 父菜单 [Navigate(nameof(ParentId))] public List<MenuEntity>? Children { get; set; } // 子菜单列表 // 多对多关系:角色-菜单 [Navigate(ManyToMany = typeof(RoleMenuEntity))] public List<RoleEntity>? Roles { get; set; } // 拥有该菜单的角色 }
[Description("角色表")] // 角色-用户:一对多关系(一个角色有多个用户) public class RoleEntity: BaseEntity<RoleEntity,int> { [Description("角色名称")] public string? RoleName { get; set; } [Navigate(nameof(UserEntity.RoleId))] public List<UserEntity>? Users { get; set; }// 导航属性到用户列表 [Navigate(ManyToMany =typeof(RoleMenuEntity))] public List<MenuEntity>? Menus { get; set; } }
[Description("角色菜单关系表")] //FreeSql复合主键配置:复合主键,唯一索引,不允许重复值 [Index("uk_role_menu", "RoleId,MenuId", true)] public class RoleMenuEntity { [Description("角色ID")] public int RoleId { get; set; } [Description("菜单ID")] public int MenuId { get; set; } [Navigate(nameof(RoleId))] public RoleEntity? Role { get; set; } [Navigate(nameof(MenuId))] public MenuEntity? Menu { get; set; } }
[Description("用户实体")] // 用户-角色:一对多关系(一个用户属于一个角色) public class UserEntity:BaseEntity<UserEntity,int> { [Description("用户名称")] public string UserName { get; set; } [Description("密码")] public string Password { get; set; } [Description("昵称")] public string NickName { get; set; } [Description("角色ID")] public int RoleId { get; set; } [Navigate(nameof(RoleId))] public RoleEntity? Role { get; set; }// 导航属性到角色 }

浙公网安备 33010602011771号