casbin_model.conf 1.6 KB

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