使用位标志设计权限系统

时间:2013-06-01 12:23:47

标签: permissions authorization

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

第二个听起来不对。

此外,您正在混合一些术语(可能是混淆的来源):

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

您可以将权限建模为角色(即权限类型角色授予您一个权限的位置),但您无法建模< em> roles 作为权限(至少听起来很奇怪)。

最终评论 - 通常安全框架使用位标志来表示operations。原因很简单 - 总是会有一定数量的operations,但可能的rolespermissions(不断增加的应用程序和新实现的功能)的数量不能受到限制。< / p>