20. 权限控制模式:ACL、RBAC、ABAC

文章目录

  • 权限控制模式
    • ACL
    • RBAC
    • ABAC
  • Go casbin 权限库的使用

权限控制模式

ACL

概述:

权限访问列表

实现原理:

给每个用户指定相应的权限。典型的用例为,微软的文件系统权限

缺点:

对权限的管理比较分散,无法集中管理。如无法一次性将某种权限分给一群用户,也无法一次性回收。

RBAC

概述:

基于角色的访问控制

实现原理:

权限的分配和回收都是基于角色的,只有对于的角色有相应的权限。用户属于一种或多种角色。

优点:

权限的管理非常方便,权限与只与角色相关,不与用户产生直接的关联。

ABAC

概述:

基于属性的权限控制

实现原理:

ABAC 则是通过动态计算一个或一组属性来是否满足某种条件来进行授权判断(可以编写简单的逻辑)。属性通常来说分为四类:用户属性(如用户年龄),环境属性(如当前时间),操作属性(如读取)和对象属性(如一篇文章,又称资源属性),所以理论上能够实现非常灵活的权限控制,几乎能满足所有类型的需求。

例如规则:“允许所有班主任在上课时间自由进出校门” 这条规则,其中,“班主任” 是用户的角色属性,“上课时间” 是环境属性,“进出” 是操作属性,而 “校门” 就是对象属性了。

缺点:

管理起来非常复杂且不直观。

Go casbin 权限库的使用

  • 官方文档:https://casbin.org/
  • 用法示例:
    • https://www.cnblogs.com/wang_yb/p/9987397.html
    • https://studygolang.com/articles/12323
  • 实例代码:

model.conf

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = (r.sub == p.sub || p.sub == "*") && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")

policy.csv

# 0: admin, 1: operator(运营), 9: guest(访客)
p, 0, *, *

# swagger api docs
p, *, /swagger/*, GET
p, *, *.ico, GET

# allow all get method
p, *, *, GET

# allow all role can login and update password
p, *, /user/login, POST
p, *, /user/password, PUT

p, 1, /app_config/*, PUT
p, 1, /app_version, POST
p, 1, /notice, POST
p, 1, /notice/*, *
p, 1, /ops_ctl, PUT

你可能感兴趣的:(Golang)