基于角色访问控制(RBAC)的主要思路是以角色为“桥梁”连接用户与资源,而角色对资源的访问控制又是通过授权许可来完成。菜单是一种特殊的资源,不过为了从技术上和业务上方便操作,可以将其单独抽出来,做为一种独立的“资源”处理。开始之前需要理解授权与认证,此处没有对认证的处理,默认流程走到授权时都是认证通过的。
1.新建/生成实体
依次为菜单表(Menu)描述系统菜单项,以URI做为基本控制单元;授权许可表(Permission)描述系统可授予的许可,同样以URI做为基本控制单元;角色表(Role)描述系统可以授予用户的角色;权限类别表(PermissionCategory)描述权限的类别,主要作用是为权限归类,该类别可以根据实际业务自定义。剩下的实体表示数据之间的关联关系,如MenuInRole表示菜单与角色的对应关系,PermissionInRole表示许可与角色的对应关系,UserInRole表示用户与角色的对应关系。因之前已经创建了授权表结构,所以这里的实体是通过EFCore的逆向工程自动生成的。示例如下:
1 /// <summary> 2 /// Menu 3 /// </summary> 4 public class Menu 5 { 6 /// <summary> 7 /// Id 8 /// </summary> 9 public string Id { get; set; } 10 /// <summary> 11 /// Name 12 /// </summary> 13 public string Name { get; set; } 14 /// <summary> 15 /// Label 16 /// </summary> 17 public string Label { get; set; } 18 /// <summary> 19 /// Icon 20 /// </summary> 21 public string Icon { get; set; } 22 /// <summary> 23 /// Uri 24 /// </summary> 25 public string Uri { get; set; } 26 /// <summary> 27 /// Parent Id 28 /// </summary> 29 public string ParentId { get; set; } 30 /// <summary> 31 /// Sort 32 /// </summary> 33 public int? Sort { get; set; } 34 /// <summary> 35 /// Is Deleted 36 /// </summary> 37 public bool IsDeleted { get; set; } 38 /// <summary> 39 /// Created By 40 /// </summary> 41 public string CreatedBy { get; set; } 42 /// <summary> 43 /// Created Time 44 /// </summary> 45 [Column(TypeName = "timestamp")] 46 public DateTime CreatedTime { get; set; } 47 /// <summary> 48 /// Last Updated By 49 /// </summary> 50 public string LastUpdatedBy { get; set; } 51 /// <summary> 52 /// Last Updated Time 53 /// </summary> 54 [Column(TypeName = "timestamp")] 55 public DateTime LastUpdatedTime { get; set; } 56 57 /// <summary> 58 /// Menu In Roles 59 /// </summary> 60 public virtual ICollection<MenuInRole> MenuInRoles { get; set; } 61 }