Files
labmem 1a48960022 feat: 添加 Go 内存分配示例并整理笔记
拆分 Go 第三方库笔记并更新索引。
新增 Gitleaks 使用说明,清理过时笔记。
2026-10-08 16:18:54 +08:00

62 lines
3.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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>