基本想法是,我们为项目建立了自定义的“启动程序”。为此,我们正在重新设计用户控制。我知道有很多关于通用RBAC的问题,但我找不到任何关于分层RBAC的问题?
我们的要求是:
- 角色可以分配给组权限
- 如果角色没有权限条目,则自动拒绝
- 用户可以被赋予超级权限
- 用户的超级权限是授予或拒绝
- 如果用户被明确拒绝某个权限,无论角色如何说“允许”,覆盖都会生效。
- 用户可以具有多个角色
- 角色可以具有层次结构
- 角色可以从其他角色继承(例如,“论坛超级版主”角色是“论坛版主”和“系统维护人员”,而“论坛版主”角色已经继承了“论坛用户”角色)
- 继承另一个角色并拒绝或授予特权的角色将覆盖其子权限
- 权限按“模块”分组(例如,“博客”模块可以有“编辑条目”权限,而“论坛”模块可以有“编辑条目”权限,它们不会冲突)
- 有一个“一切和任何事物”的权限,自动授予完全访问权限
所以,在这些要求得到满足后,以下是我对它的想法。
表:用户
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
实际上这只是其中一半,我确定的那部分。我遇到困难的是层级角色。
那么,我该如何设计呢? 我的想法是,在登录时建立权限矩阵并将其保存到会话中,以节省数据库查询次数,因此每次登录只需要运行一次简单的查询。
我看到的问题是,我需要知道角色的层级结构,以便在解决继承之前解决继承的角色权限。
用户权限是容易的部分,每个用户的权限实际上是最终确认的组。
user
没有role
,但是有permission
,这是有原因的吗?这是“权限模型”,而不是“角色模型”,对吗?采用这种方法,角色没有被使用。 - BlitZuser
没有拥有permission
的理由,它可以拥有带有permission
的role
,但不能直接拥有permission
。这会破坏逻辑(依我看)。 - BlitZ