How It Works
No Casbin, um modelo de controle de acesso é abstraído em um arquivo CONF baseado no metamodelo PERM (Policy, Effect, Request, Matchers). Trocar ou atualizar o mecanismo de autorização para um projeto é tão simples quanto modificar uma configuração. Você pode personalizar seu próprio modelo de controle de acesso combinando os modelos disponíveis. Por exemplo, você pode combinar papéis RBAC e atributos ABAC juntos dentro de um mesmo modelo e compartilhar um conjunto de regras de política.
O modelo PERM é composto por quatro fundamentos: Política, Efeito, Requisição e Correspondentes. Esses fundamentos descrevem a relação entre recursos e usuários.
Request
Define os parâmetros da requisição. Uma requisição básica é um objeto tupla, exigindo pelo menos um sujeito (entidade acessada), objeto (recurso acessado) e ação (método de acesso).
Por exemplo, uma definição de requisição pode ser assim:
r={sub,obj,act}
Policy
Esta definição especifica os nomes dos parâmetros e a ordem exigida pela função de correspondência de controle de acesso. Define o modelo para a estratégia de acesso.
Especifica o nome e a ordem dos campos no documento de regra de Política.
Por exemplo:
Matcher
p={sub, obj, act}
ou p={sub, obj, act, eft}
Nota: Se eft (resultado da política) não for definido, o campo de resultado no arquivo de política não será lido, e o resultado da política correspondente será permitido por padrão. Define as regras de correspondência para Requisição e Política.
Effect
Por exemplo: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
Esta regra de correspondência simples e comum significa que se os parâmetros solicitados (entidades, recursos e métodos) forem iguais aos encontrados na política, então o resultado da política (p.eft
) é retornado.
O resultado da estratégia será salvo em p.eft
.
Realiza um julgamento de combinação lógica nos resultados de correspondência dos Correspondentes.
Por exemplo: e = some(where(p.eft == allow))
Esta declaração significa que se o resultado da estratégia de correspondência p.eft
tiver o resultado de (algum) permitir, então o resultado final é verdadeiro. Vamos olhar para outro exemplo: e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
O significado lógico desta combinação de exemplo é: se houver uma estratégia que corresponda ao resultado de permitir e nenhuma estratégia que corresponda ao resultado de negar, o resultado é verdadeiro. Em outras palavras, é verdadeiro quando as estratégias de correspondência são todas de permitir.
# Request definition
[request_definition]
r = sub, obj, act
# Policy definition
[policy_definition]
p = sub, obj, act
# Policy effect
[policy_effect]
e = some(where (p.eft == allow))
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
Se houver qualquer negação, ambos são falsos (mais simplesmente, quando permitir e negar existem ao mesmo tempo, a negação tem precedência).
p, alice, data1, read
p, bob, data2, write
O modelo mais básico e simples no Casbin é o ACL.
- O modelo CONF para ACL é o seguinte:
- Um exemplo de política para o modelo ACL é:
Isso significa:
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act
alice pode ler data1
# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')
Nós também suportamos o modo multi-linha anexando '' no final:
bob pode escrever data2