Files
lab/note/资源/编程/Golang/常用第三方库/casbin.md
T
labmem 1a48960022 feat: 添加 Go 内存分配示例并整理笔记
拆分 Go 第三方库笔记并更新索引。
新增 Gitleaks 使用说明,清理过时笔记。
2026-10-08 16:18:54 +08:00

3.4 KiB
Raw Blame History

Casbin 学习笔记

版本基线:casbin v3.11.0;Go import 路径 github.com/casbin/casbin/v3(源码仓库 apache/casbin)。本文是概念速记,不是教程。 Casbin 负责授权(能不能做某事),不负责身份认证(你是谁)。

1. 心智模型:PERM

段 作用
[request_definition] r = sub, obj, act 一次访问请求长什么样
[policy_definition] p = sub, obj, act 一条策略规则长什么样
[policy_effect] e = some(where (p.eft == allow)) 多条策略如何合成结论
[matchers] m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act r 与 p 如何配对
  • sub, obj, act 只是最典型的字段,不是硬编码:可加 dom、资源属性,也可用对象做 ABAC。
  • RBAC 再加 [role_definition] g = _,_,表示主体与角色的继承关系;g(a, b) 意为“a 属于 b”,角色链会递归解析。
  • 模型只描述“怎么判”,策略才决定“允许谁”,两者可分开存储与更新。

2. 核心组件

Casbin 运行时由以下组件构成,多数可在不同程度上替换或选配:

组件 职责
Model PERM 四段组成的规则模型,描述匹配逻辑,不含具体策略
Policy 具体策略规则的集合,可在内存或外部存储
Enforcer 判定入口:把请求套进模型与策略,得到 true/false
Adapter 策略的存储读写层(DB/文件等),由应用选配
RoleManager 维护角色继承关系,支撑 g()
Watcher 感知其他实例的变更并触发重载;Dispatcher 负责派发变更事件

组件协作:Model + Policy 交给 Enforcer 判定;Adapter 负责把 Policy 读入/写出;RoleManager 供 g() 解析继承;Watcher/Dispatcher 让多实例感知变更。

3. 判定链与策略示意

请求 → matcher 匹配 → 命中的策略 effect 合成 → 结果。

g, alice, admin            # alice 属于 admin
p, admin, report, read     # admin 可读 report
Enforce(alice, report, read) => true   # 经角色继承
Enforce(bob, report, read)   => false  # 无授权
  • 判定按请求逐条扫描策略:matcher 命中后,由 effect 合成最终结论。
  • some(where (p.eft == allow)) 是白名单语义:只要有一条 allow 就放行。

4. 关键提醒

  • deny 与 error 都 fail-closed:false 是判定为拒,err != nil 是判定失败;安全场景两者都当拒绝,别把错误当放行。
  • 并发优先 SyncedEnforcer:常用 API 有锁;普通 Enforcer 需自行加锁,也不要假设所有接口都并发安全。
  • 内存策略不会自动跨实例同步:Casbin 核心不内置同步,多副本要自己配置 Watcher 通知或周期重载/对账。
  • ABAC 能判断单条对象的属性/所有权,但不会自动生成 SQL 查询过滤,列表与行级数据范围仍需业务层实现。
  • 迁移 v2 → v3:只确认 adapter 自身路径带 /v3 不够,要核对其 go.mod 是否依赖 github.com/casbin/casbin/v3;v2 与 v3 的 model.Model 是不同 Go 包类型。
  • Enforce 的参数要与 r 定义一致,类型/语义由模型与 matcher 决定,不是固定三元组。

官方来源