Pattern-based RBAC
快速开始
-
Without domains — 为
g注册匹配函数:e, _ := NewEnforcer("./example.conf", "./example.csv")e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2) -
With domains — 使用支持域的 API:
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2) -
Both — 如果您的模型在用户-角色和域匹配中都使用了模式,请调用这两个 API。
您必须在创建 enforcer 之后调用这些函数;它们定义了如何评估模式匹配。
如果使用在线编辑器,请点击左下角的 "Add Role Matching" 按钮添加模式匹配函数。

模式匹配的工作原理
模式匹配允许单条策略行匹配多个主体、对象或域(例如 /book/:id 可以匹配 /book/1、/book/2)。这些函数使用与 matcher functions 相同的签名;你需要为 g 的参数注册它们。
示例:如果没有模式匹配,你可能需要这样写:
p, alice, book_group, read
g, /book/1, book_group
g, /book/2, book_group
因此 alice 可以读取每一本书,但你需要为每本书添加一行 g。对于大量书籍,请使用 pattern 代替:
g, /book/:id, book_group
Casbin 随后会将 /book/1、/book/2 等匹配到 /book/:id。请注册匹配函数:
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedMatchingFunc('g', Util.keyMatch2Func);
对于域模式匹配(例如 g(r.sub, p.sub, r.dom)),请使用:
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedDomainMatchingFunc('g', Util.keyMatch2Func);
关于 g(r.sub, p.sub, r.dom) 的含义,请参阅 RBAC with domains。完整示例:model_test.go。
带有域的模式匹配支持自定义域令牌名称。除了 dom,你可以使用任何标识符,如 tenant 或 workspace。当使用像 keyMatch 这样的模式匹配函数时,Casbin 会自动从模型定义中检测域令牌名称。
域通配符: 你可以在 g 的域位置使用通配符,以在所有域中授予角色。示例:
p, admin, domain1, data1, read
p, admin, domain1, data1, write
p, admin, domain2, data2, read
p, admin, domain2, data2, write
g, alice, admin, *
g, bob, admin, domain2
因此 alice 在每个域(*)中都拥有 admin 角色,而 bob 仅在 domain2 中是 admin。当你拥有许多域或资源时,模式匹配和域通配符可以让策略保持简短。
Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.