首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用位标志设计权限系统

使用位标志设计权限系统
EN

Stack Overflow用户
提问于 2013-06-01 12:23:47
回答 1查看 1K关注 0票数 1

我第一次使用整数中的位标志设计了一个许可系统,我发现我一直搞错了。当我终于冷静下来,让我的头,我意识到有两个“方向”来接近它,我不是一贯的,造成许多混乱。

假设我有两个方法

代码语言:javascript
复制
create_contract() // sales administrators and higher
approve_contract(); // sales managers and higher

我有两个许可权值

代码语言:javascript
复制
permission::SALES_ADMIN = 0x0001;
permission::SALES_MANAGER = 0x0002;

权限检查功能是

代码语言:javascript
复制
bool is_allowed(method_permission, user_permission)
{
    return (method_permission & user_permission) > 0
}

方法1:只授予每个用户他的角色,并给予方法每个可以访问它的权限

代码语言:javascript
复制
create_contract.permission = permission::SALES_ADMIN | permission::SALES_MANAGER;
approve_contract.permission = permission::SALES_MANAGER;
John.permission = SALES_ADMIN;
Peter.permission = SALES_MANAGER;

方法2:为用户提供他可以充当的所有角色,并赋予方法可以访问它的最小角色()

代码语言:javascript
复制
create_contract.permission = permission::SALES_ADMIN
approve_contract.permission = permission::SALES_MANAGER
John.permission = SALES_ADMIN;
Peter.permission = SALES_ADMIN | SALES_MANAGER;

既然这是我的第一次,我想问一下,这两种方法之间是否有什么功能上的区别?哪一个有更多的好处和更普遍的使用?还是有更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-01 14:10:53

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

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

第二个听起来不对。

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

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

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

最后的注释--通常安全框架使用位标志来表示operations。原因很简单-- operations的数量总是有限的,但是可能的rolespermissions (具有不断增长的应用程序和新实现的功能)的数量是无法限制的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16872686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档