最近团队由于项目需求的增多,需要单独设计一个权限系统出来,参考了网上很多的权限/访问控制系统以及一些设计原则比如RBAC(Role-Based Access Control),这里,记录一下自己对权限系统的一种构想。需要注意的是,RBAC中也有分组的概念,但是它的分组仅仅是为了将相同权限的人集中在一起。我的构想虽然没有分组的概念,但是也符合RBAC原则的,只是因为我做的更彻底,不仅将角色与权限直接关联,更是将用户与权限直接关联,产生了一定的冗余,更适用于人数少但是权限多的情况。
实体表
应用表
字段名 | 字段注释 |
---|---|
id | app_id |
角色表
字段名 | 字段注释 |
---|---|
id | role_id |
app_id | 应用ID |
name | 名称(英文) |
beta | 备注 |
权限表
字段名 | 字段注释 |
---|---|
id | privilege_id |
app_id | 应用ID,不提供表示通用的权限 |
name | 名称(英文),例如projects表示项目相关的权限,这里如果想要有更复杂的层级关系,可以用点号进行分割,但不建议增大权限的层次 |
beta | 备注 |
操作表
记录一些通用的操作,例如增删该查等。当然,这里的操作表可以省略,而直接将操作以父子关系放在权限表中。
字段名 | 字段注释 |
---|---|
id | operator_id |
app_id | 不提供表示通用的操作 |
name | 名称(英文),例如: add,delete,edit,query等,或者页面上index,create,admin等 |
beta | 备注 |
关联表
用户与权限关联表:此表与角色权限对应表之间是有一定冗余的,但是考虑到个性化需求以及第三方APP的需要,所以在可以忍受的范围内
字段名 | 字段注释 |
---|---|
id | |
user_id | 用户ID |
role_id | 角色ID: 为0表示该权限是独立分配的,独立分配的优先 |
privilege_id | 权限ID |
operator_id | 操作ID |
disabled | boolean |
角色与权限对应表
可以将用户与权限的关联表和角色与权限的关联表合并,使用target
来标识
字段名 | 字段注释 |
---|---|
id | |
role_id | 角色ID |
privilege_id | 权限ID |
operator_id | 操作ID |
用户与角色对应表
字段名 | 字段注释 |
---|---|
id | |
role_id | 角色ID |
user_id | 用户ID |
常用操作
添加权限: 直接添加,并设置好其
给单独用户添加权限:保存在角色与权限表中,这样用户的实际权限就应该是用户绑定角色拥有的权限与用户单独分配的权限之和。
给单独用户删除权限:如果是单独添加并且绑定角色所没有的,直接删除关联关系;如果是绑定角色所关联的权限,那么将关联表中的权限标识为禁用;如果是单独添加并且绑定角色也有的,同样标识为禁用。所以最终,用户的实际权限是用户绑定角色拥有的权限与用户单独分配的权限之和减去禁用的权限,当然由于有冗余,直接在关联表中读取没禁用的权限即可。
删除用户角色: 直接根据role_id进行disabled,添加了就不直接删除
删除用户权限:直接根据role_id进行disabled,也不直接删除
其他平台登录:只需要在登录的时候获取该用户在该平台的所有的额权限即可,连分组都不需要,因为权限都是在权限系统中进行统一登记注册的,所以其他平台不用单独存储权限列表,而只需要获取获取当前用户的权限,放到缓存里面即可,例如redis,可以直接存储为一个列表user:privileges []