DEV Community

Cover image for Permissão acumulável
Hugo Felippe de Souza Cruz
Hugo Felippe de Souza Cruz

Posted on • Updated on

Permissão acumulável

Esse sistema de permissões é semelhante ao modo octal de permissões do Linux onde se tem um numero para cada tipo de permissão:

Chave Descrição
1 Permissão para visualizar
2 Permissão para criar
4 Permissão para editar
8 Permissão para remover

E pode se fazer combinações por exemplo: 1 + 2 = 3 dando assim permissão de leitura e criação.

Caso seja necessário outros tipos de permissões, pode ser adicionados mais por meio de uma progressão geométrica, por exemplo se eu quiser adicionar uma 5 chave de permissão eu vou utilizar o 16, e a 6 chave seria 32.

Lembrando que a descrição das chaves podem ser alteradas para cada sistema, a única restrição é que se a somatória for definida com uma certa intenção (como no exemplo da tabela em cima) essa somatória deve ser utilizada apenas com essa intenção, caso contrário a permissão será corrompida.

Exemplos

// Visualizar + Criar + Remover: 11
$permissao = 1 + 2 + 8;

// Visualizar + Editar: 5
$permissao = 1 + 4;
Enter fullscreen mode Exit fullscreen mode

Outros tipos de intenção

O exemplo abaixo é uma descrição de intenção onde se tem uma somatória para cada produto de uma ordem de serviço, essa permissão armazenada em cada item da O.S. indica se um campo do item pode ser visualizado, dessa forma um usuário que faz a moderação de cada item pode definir se o campo de um item (como a descrição por exemplo) pode ser visualizado pelos usuários que tem essa regra de visualização mais restrita

Chave Descrição
1 Visível campo 1
2 Visível campo 2
4 Visível campo 3

Verificando a permissão

Para verificar a permissão do sistema acima é necessário utilizar essa expressão (PERMISSION / TYPE) % 2 >= 1 ou (PERMISSION / TYPE) % 2 < 1, onde PERMISSION corresponde a somatória das permissões e TYPE corresponde a chave da permissão que deseja saber se é permitido.

Exemplos

No exemplo abaixo eu quero verificar se um usuário tem a permissão para editar algum item:


/**
 * somatória das permissões do usuário
 * a um determinado item
 */
$permissao = 11;

/**
 * chave do tipo de permissão
 * 4 = Permissão para editar
 */
$tipo = 4;

/**
 * O resultado da expressão '($permissao / $tipo) % 2'
 * vai retornar 0 se o $tipo não estiver incluído na
 * somatória de $permissão
 */


if (($permissao / $tipo) % 2 >= 1) {
    // o usuário possui permissão para alterar o item
}


if (($permissao / $tipo) % 2 < 1) {
    // o usuário não possui permissão para alterar o item
}

Enter fullscreen mode Exit fullscreen mode

Top comments (0)