Pular para o conteúdo principal

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.

nota

Se você usar o editor online, ele especifica a função de correspondência de padrões no canto inferior esquerdo. editor-tips

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:

e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)

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.

e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)

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.