# 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|*>, , # 角色继承(g):g, , , ——当前不预填(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)