基本交易是,我们为我们的项目定制了一个“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_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
好吧,实际上这是一半,我确定的那部分,我卡住的部分是等级角色。
那么,我该如何设计呢?我的想法是,为了保存数据库查询,我只是要在登录时构建权限矩阵并将其保存到会话中,这样查询就不必太简单,因为它们每次登录只运行一次。
我看到的问题是,我需要知道角色的层次结构,以便在解决继承问题之前解决继承的角色权限。
用户权限是容易的部分,每个用户的权限本质上是最终解决的组。