Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

权限系统及模型 #34

Open
isayme opened this issue Nov 2, 2018 · 3 comments

Comments

@isayme
Copy link
Owner

commented Nov 2, 2018

主要介绍当前主流的权限系统及适用的场景. 理解错误的地方麻烦之处.

用户是抽象概念, 包含但不限定是 user(person).

ACL

ACL 是 Access Control List 的缩写,称为访问控制列表. 定义了谁可以对某个数据进行何种操作.
关键数据模型有: 用户, 权限.

ACL规则简单, 也带来一些问题: 资源的权限需要在用户间切换的成本极大; 用户数或资源的数量增长, 都会加剧规则维护成本;

典型应用

文件系统

文件系统的文件或文件夹定义某个账号(user)或某个群组(group)对文件(夹)的读(read)/写(write)/执行(execute)权限.

网络访问

防火墙: 服务器限制不允许指定机器访问其指定端口, 或允许特定指定服务器访问其指定几个端口.

RBAC

RBAC 是 Role-based access control 的缩写, 称为 基于角色的访问控制.
核心数据模型有: 用户, 角色, 权限.

用户具有角色, 而角色具有权限, 从而表达用户具有权限.

由于有角色作为中间纽带, 当新增用户时, 只需要为用户赋予角色, 用户即获得角色所包含的所有权限.

RBAC 存在多个扩展版本, 包含更为丰富的功能:

  • RBAC1 的角色继承, 角色可以继承另一个角色的全部能力: 业务部门主管拥有专员的全部权限;
  • RBAC2 的角色互斥, 比如: 财务会计 和 财务审计 两个角色, 又比如 球员 和 裁判 两个角色;
  • RBAC2 的先决条件: 只有北京户口才可以参加北京高考;
  • RBAC2 的基数约束, 角色只能赋予有限数量的用户: 公司只能有一个拥有者;

ABAC

ABAC 是 Attribute-based access control 的缩写, 称为 基于属性的访问控制.

权限和资源当时的状态(属性)有关, 属性的值可以用于正向判断(符合某种条件则通过), 也可以用于反向判断(符合某种条件则拒绝):

  • 论坛的评论权限, 当帖子是锁定状态时, 则不再允许继续评论;
  • Github 私有仓库不允许其他人访问;
  • 发帖者可以编辑/删除评论(如果是RBAC, 会为发帖者定义一个角色, 但是每个帖子都要新增一条用户/发帖角色的记录);
  • 微信聊天消息超过2分钟则不再允许撤回;
  • 12306 只有实名认证后的账号才能购票;
  • 已过期的付费账号将不再允许使用付费功能;

参考资料

@isayme

This comment has been minimized.

Copy link
Owner Author

commented Nov 2, 2018

Q: 对层级资源的权限处理.
典型的是文件库. 用户A文件B有权限读写, 但是对文件B所在文件夹C没有读权限, 那么用户A到底有没有文件B的读写权限?

@isayme

This comment has been minimized.

Copy link
Owner Author

commented Nov 5, 2018

Q: 存在读权限的情况下, 如何做到批量读及分页?
Gitlab 获取 repo 列表, 不同的人看到的数据不一样, 能看到的包括: 公开的 repo; 加入的 repo; 可见性为 internal 且当前账号是 group 成员的 repo;

@isayme

This comment has been minimized.

Copy link
Owner Author

commented Nov 15, 2018

权限模型的一些实现参考

Node.js

Golang

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
1 participant
You can’t perform that action at this time.