| 123456789101112131415161718192021222324252627282930313233 |
- # RBAC with Domains 策略模型(casbin v3)
- # 定位:RBAC 三层模型的"第②层接口强制"——角色 + 机构(domain) + 资源(path) + 动作(method)。
- # 依据:unified/01-architecture/casbin-rbac-design.md v1.1(sub=角色码 / 两表并存 / 30s 轮询已拍板)。
- #
- # 请求四维:
- # r.sub = 角色码(super_admin/academic/finance/teacher/student/parent/market;拍板用 sc.Role,非 ULID)
- # r.dom = 机构 ID(institution_id;策略可写 * 表示不区分机构)
- # r.obj = 请求 path(keyMatch2 通配,如 /org/institutions/*)
- # r.act = HTTP method(regexMatch,如 GET|POST)
- #
- # 策略(p):p, <角色码>, <机构ID|*>, <path>, <method>
- # 角色继承(g):g, <name>, <role>, <dom>——当前不预填(sub 直接=角色码,g 自匹配成立),
- # 保留定义供未来"人级授权"升级(sub 换 ULID + membership 变更写 g 规则,见设计 §4.2)。
- #
- # matcher:
- # - g(r.sub, p.sub, r.dom):角色码在 dom 下的继承自匹配(当前恒真,无 g 规则时);
- # - (p.dom == "*" || r.dom == p.dom):策略 dom=* 全机构放行,或 dom 精确匹配;
- # - keyMatch2(r.obj, p.obj):path 通配匹配(/org/institutions/* 匹配 /org/institutions/1);
- # - regexMatch(r.act, p.act):method 正则匹配("GET|POST" 命中 GET 或 POST)。
- [request_definition]
- r = sub, dom, obj, act
- [policy_definition]
- p = sub, dom, obj, act
- [role_definition]
- g = _, _, _
- [policy_effect]
- e = some(where (p.eft == allow))
- [matchers]
- m = g(r.sub, p.sub, r.dom) && (p.dom == "*" || r.dom == p.dom) && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act)
|