Casbin:模型、策略与 RBAC 示例
Casbin Model 请求、策略与角色定义
以 subject、object、action 三元组说明请求和策略,并使用角色映射 g 进行 RBAC 匹配。示例是模型定义,身份认证和用户管理由应用负责。
model语法
- 模型语法见Casbin 官方说明。通常包含四个部分: [request_definition], [policy_definition], [policy_effect], [matchers]。
- 如果 model 使用 RBAC, 还需要添加[role_definition]部分。
- Model CONF 文件可以包含注释。注释以 # 开头, # 会注释该行剩余部分
基本语法
conf
[request_definition] # 请求定义-> 明确了 e.Enforce(...) 函数中的参数
# sub-> 访问实体(Subject) 如果有两个访问实体,则可以为 sub1,sub2,obj,act
# obj-> 访问资源(Object)
# Act-> 访问方法
r = sub, obj, act
[policy_definition] # 政策定义-> 部分是对policy中的规则具体描述
p = sub, obj, act
# p2 = sub, act
# 本例只启用 p;Casbin 也支持 p2 等多种策略定义,需由相应匹配器/执行上下文明确使用。
# p, alice, data1, read
# p2, bob, write-all-objects
[role_definition]
g = _, _
[policy_effect] # 政策效应->
e = some(where (p.eft == allow))
[matchers] # 匹配器
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.actCasbin base
本轮只做理论正文与源码静态复核;下列命令、示例和测试均未执行。已有输出按代码推演或历史记录理解,不作为本轮运行证据。
Casbin 是什么?
Casbin 可以:
- 支持自定义请求的格式,默认的请求格式为{subject, object, action}。
- 具有访问控制模型model和策略policy两个核心概念。
- 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
- 超级用户必须由模型匹配规则或明确策略表达;账号恰好叫 root 或 Administrator 不会自动绕过授权。
- 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*
Casbin 不能:
- 身份认证 authentication(即验证用户的用户名、密码),casbin只负责访问控制。应该有其他专门的组件负责身份认证,然后由casbin进行访问控制,二者是相互配合的关系。
- 管理用户列表或角色列表。 Casbin 认为由项目自身来管理用户、角色列表更为合适, 用户通常有他们的密码,但是 Casbin 的设计思想并不是把它作为一个存储密码的容器。 而是存储RBAC方案中用户和角色之间的映射关系。
安装
go get github.com/casbin/casbin/v2
使用
- 使用 GORM:先选择匹配的存储适配器,并按适配器版本准备数据库。
- 使用file:加载下面完整 model.conf 与 policy.csv;这是授权配置示例,不是包含依赖锁定的完整 Go 应用。
最小 RBAC 配置与决策
model.conf:
ini
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.actpolicy.csv:
csv
p, editor, /notes, read
g, alice, editor模型将身份、资源与动作分别比较,角色关系由g维护;没有路径通配或超级用户分支。纸面推演:alice读取/notes为true,alice写/notes为false,root读取/notes为false,alice读取/notes/1也为false。适配器只是策略存取方式,不负责用户名密码认证;修改文件是否重新载入仍由应用明确处理。
题目:给root无条件放行是否等于身份认证成功?提示:分别看身份来源和模型分支。
参考答案
不是。模型只能对收到的主体做授权判断,主体必须先由应用可信认证。给某主体放行是额外授权规则,不是Casbin默认行为;本例故意不加入它。
继续阅读
- 知识专题
- 知识专题
- 应用实践