如何设计基于分层角色的门禁系统
2022-08-30 12:04:23
基本协议是,我们为我们的项目定制了一个“kickstart”。为此,我们正在研究重做用户控件。我知道有很多关于一般rbac的问题,但我找不到任何关于分层rbac的问题?
我们的要求是:
- 可以将角色分配给组权限
- 如果角色没有权限条目,则会自动拒绝该角色
- 可以向用户授予覆盖权限
- 用户覆盖权限是授予或拒绝
- 如果用户被显式拒绝,则无论什么角色说“已授予”,覆盖都会获胜。
- 用户可以具有多个角色
- 角色可以具有层次结构
- 角色可以从其他角色继承(例如,“论坛超级版主”角色是“论坛版主”,“系统维护者”,而“论坛版主”角色已经继承自“论坛用户”角色)
- 从拒绝或授予特权的其他角色继承的角色将覆盖其子权限
- 权限按“模块”分组(例如,“博客”模块可以具有“编辑条目”权限,“论坛”模块可以具有“编辑条目”权限,并且它们不会发生冲突)
- 有一个“Everything and Anything”权限,可自动授予完全访问权限
因此,有了这些要求,这就是我的想法。
表:用户
id | int | unique id
表:角色
id | int | unique id
--------------|---------------------------------------------
title | varchar | human readable name
表:权限
id | int | unique id
--------------|---------------------------------------------
module | varchar | module name
--------------|---------------------------------------------
title | varchar | human readable name
--------------|---------------------------------------------
key | varchar | key name used in functions
表:Role_User
role_id | int | id from roles table
--------------|---------------------------------------------
user_id | int | id from users table
表:Permission_Role
id | int | unique id
--------------|---------------------------------------------
permission_id | int | id from permissions table
--------------|---------------------------------------------
role_id | int | id from roles table
--------------|---------------------------------------------
grant | tinyint | 0 = deny, 1 = grant
表:Permission_User
id | int | unique id
--------------|---------------------------------------------
permission_id | int | id from permissions table
--------------|---------------------------------------------
user_id | int | id from users table
--------------|---------------------------------------------
grant | tinyint | 0 = deny, 1 = grant
好吧,实际上这是其中的一半,我确信的那部分,我陷入困境的部分是分层角色。
那么,我该如何设计呢?我的想法是,为了节省数据库查询,我只是在登录时构建权限矩阵并将其保存到会话中,这样查询就不必太简单,因为它们每次登录只运行一次。
我看到的问题是,我需要知道角色的层次结构,以便在解决继承之前解决继承的角色权限。
用户权限是容易的部分,每个用户的权限本质上是最终解析的组。