[request_definition] r = sub, obj, act [policy_definition] p = sub, obj, act [role_definition] g = _, _ [policy_effect] e = some(where (p.eft == allow)) # 真源策略:user_roles 表为用户-角色唯一真源;Casbin 仅存 p, role, resource, action。 # EnforceForUser 由 CasbinService 先查 DB 角色再对每个角色调 Enforce(role, obj, act), # 因此 matcher 直接匹配 r.sub == p.sub(角色直接匹配),不再依赖 g 分组。 # # matcher 使用 globMatch(doublestar 语义): # - '* 匹配单层资源段(不跨 '/'); # - '**' 跨多层(如 admin/** 命中 admin/users/roles/write)。 # 资源命名采用路径式 admin/[/],避免 keyMatch2 把 '*' 当作正则通配 # 跨 '.' 而误匹配;也避免 globMatch 在点号分隔下 '*' 仍跨 '.' 的过宽问题。 [matchers] m = r.sub == p.sub && globMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")