1

我第一次使用整数中的位标志设计一个权限系统,但我发现我一直弄错了。当我终于平静下来并转过头来时,我意识到有两个“方向”可以接近它,而且我自始至终都不一致,造成了很多混乱。

假设我有 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;

由于这是我第一次,我想问一下这两种方法之间是否有任何功能差异?哪一个有更多的好处,更常用?还是有更好的方法?

4

1 回答 1

0

第一种方法是正确的,因为它更好地模拟了现实。只需大声朗读以下句子:

  • 方法 1:合同可以由 ADMINISTRATOR 和 MANAGER 创建。
  • 方法 2:合同只能由管理员创建。所有经理都自动成为管理员。

第二个听起来不太对劲。

您还混合了一些术语(这可能是混淆的根源):

  • role- 功能位置(SALES_ADMINSALES_MANAGER
  • permission- 授权执行特定操作(create_contract.permissionCREATE_CONTRACT

您可以将权限建模为角色(即权限类型角色仅授予您一个权限),但您不能将角色建模为权限(至少听起来很奇怪)。

最后的评论 - 通常安全框架使用位标志来表示operations. 原因很简单——总会有有限的数量operations,但是可能的数量rolespermissions(随着应用程序的增长和新实现的功能)的数量是不受限制的。

于 2013-06-01T14:10:53.337 回答