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.
Se você usar o editor online, ele especifica a função de correspondência de padrões no canto inferior esquerdo.
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.