Pular para o conteúdo principal

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