RBAC with Pattern
Início Rápido
Use padrão em
g(_, _)
.e, _ := NewEnforcer("./example.conf", "./example.csv")
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)Use padrão com domínio.
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
Use todos os padrões.
Apenas combine o uso de ambas as APIs.
Como mostrado acima, depois de criar a instância enforcer
, você precisa ativar a correspondência de padrões através das APIs AddNamedMatchingFunc
e AddNamedDomainMatchingFunc
, que determinam como o padrão corresponde.
If you use the online editor, You can add a pattern matching function by clicking the "Add Role Matching" button in the lower left corner.
Use correspondência de padrões em RBAC
Às vezes, você quer que certos sujeitos, objetos ou domínios/inquilinos com um padrão específico sejam automaticamente concedidos uma função. As funções de correspondência de padrões em RBAC podem ajudá-lo a fazer isso. Uma função de correspondência de padrões compartilha os mesmos parâmetros e valor de retorno que a função de correspondência anterior.
A função de correspondência de padrões suporta cada parâmetro de g
.
Sabemos que normalmente RBAC é expresso como g(r.sub, p.sub)
em um correspondente. Então podemos usar uma política como:
p, alice, book_group, read
g, /book/1, book_group
g, /book/2, book_group
Então alice
pode ler todos os livros incluindo book 1
e book 2
. Mas pode haver milhares de livros, e é muito tedioso adicionar cada livro ao papel de livro (ou grupo) com uma regra de política g
.
Mas com funções de correspondência de padrões, você pode escrever a política com apenas uma linha:
g, /book/:id, book_group
Casbin irá automaticamente combinar /book/1
e /book/2
no padrão /book/:id
para você. Você só precisa registrar a função com o enforcer como:
- Go
- Node.js
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedMatchingFunc('g', Util.keyMatch2Func);
Ao usar uma função de correspondência de padrões em domínios/inquilinos, você precisa registrar a função com o enforcer e o modelo.
- Go
- Node.js
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedDomainMatchingFunc('g', Util.keyMatch2Func);
Se você não entende o que g(r.sub, p.sub, r.dom)
significa, por favor leia rbac-with-domains. Em resumo, g(r.sub, p.sub, r.dom)
verificará se o usuário r.sub
tem um papel p.sub
no domínio r.dom
. Então é assim que o correspondente funciona. Você pode ver o exemplo completo aqui.
Além da sintaxe de correspondência de padrões acima, também podemos usar padrão de domínio puro.
Por exemplo, se quisermos que sub
tenha acesso em diferentes domínios, domain1
e domain2
, podemos usar o padrão de domínio puro:
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
Neste exemplo, queremos que alice
leia e escreva data
no domain1 e domain2. A correspondência de padrões *
em g
faz com que alice
tenha acesso a dois domínios.
Ao usar correspondência de padrões, especialmente em cenários mais complicados e com muitos domínios ou objetos a considerar, podemos implementar a policy_definition
de uma maneira mais elegante e eficaz.