Skip to content
← 返回身份与权限列表
命令与对象入口

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.act

Casbin 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.act

policy.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默认行为;本例故意不加入它。

继续阅读