我是第一次在整数中使用位标志设计一个权限系统,我发现我一直都弄错了。当我终于冷静下来并开始理解时,我意识到有两个“方向”可以接近它并且我始终不一致,造成很多混乱。
假设我有2个方法
create_contract() // sales administrators and higher
approve_contract(); // sales managers and higher
我有2个权限值
permission::SALES_ADMIN = 0x0001;
permission::SALES_MANAGER = 0x0002;
权限检查功能是
bool is_allowed(method_permission, user_permission)
{
return (method_permission & user_permission) > 0
}
方法1:只为每个用户授予他的角色,并为每个可以访问它的权限提供方法
create_contract.permission = permission::SALES_ADMIN | permission::SALES_MANAGER;
approve_contract.permission = permission::SALES_MANAGER;
John.permission = SALES_ADMIN;
Peter.permission = SALES_MANAGER;
方法2:为用户提供他可以充当的所有角色,并为方法提供可以访问它的最小角色
create_contract.permission = permission::SALES_ADMIN
approve_contract.permission = permission::SALES_MANAGER
John.permission = SALES_ADMIN;
Peter.permission = SALES_ADMIN | SALES_MANAGER;
由于这是我第一次,我想问一下这两种方法之间是否存在功能差异?哪一个有更多的好处,更常用?或者有更好的方法吗?
答案 0 :(得分:0)
第一种方法是正确的,因为它更好地模拟现实。只需大声读出以下句子:
第二个听起来不对。
此外,您正在混合一些术语(可能是混淆的来源):
role
- 功能位置(SALES_ADMIN
和SALES_MANAGER
)permission
- 授权执行特定操作(create_contract.permission
或CREATE_CONTRACT
)您可以将权限建模为角色(即权限类型角色授予您一个权限的位置),但您无法建模< em> roles 作为权限(至少听起来很奇怪)。
最终评论 - 通常安全框架使用位标志来表示operations
。原因很简单 - 总是会有一定数量的operations
,但可能的roles
或permissions
(不断增加的应用程序和新实现的功能)的数量不能受到限制。< / p>