wip: 保存 Go 练习和技术笔记

This commit is contained in:
2026-09-24 14:16:17 +08:00
parent 64cc3ec381
commit babd8f2793
20 changed files with 1229 additions and 29 deletions
+61
View File
@@ -0,0 +1,61 @@
# 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 决定,不是固定三元组。
## 官方来源
- v3.0.0 release(module path 变更):<https://github.com/apache/casbin/releases/tag/v3.0.0>
- v3.11.0 `persist/adapter.go`:<https://github.com/apache/casbin/blob/v3.11.0/persist/adapter.go>
- ABAC 文档:<https://casbin.org/docs/abac>