Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sergio Tomas

Algoritmo de Permissões

Recommended Posts

Olá pessoal boa tarde,

 

Alguem poderia me explicar como funciona o algortimo de permissões baseado no Unix, vou dar um exemplo mais ou menos do que estou desenvolvendo aqui para vocês terem ideia do que eu estou precisando:

 

1° Tenho uma tabela que contem as seguintes permissões e o nível delas

 

Visualizar = 1

Gravar = 2

Editar = 4

Deletar = 8

 

Pelo o que pesquisei e tentei entender o sistema de privilégios do Unix pega a minha permissão baseado na soma dos níveis, e eu quero entender como ele faz esse cálculo para saber se eu posso (Visualizar, Visualuzar/Gravar, ou Editar/Visualizar) etc..

 

Espero que eu tenha sido claro.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, desculpe estar me intrometendo, digo isso porque não sei nada sobre Unix, mas eu estou com um problema no controle de permissões do sistema que desenvolvo,a credito que essa sua dúvida possa ser a solução dos meus problemas, hehe, vamos lá...

 

Se a permissão é baseada na soma desses valores, basta analisar que o próximo número seria o dobro do anterior, portando 8 * 2 = 16, se somarmos todos os números anteriores a 16, vamos obter o resultado 15, sendo assim, haveria diversos privilégios sem repetições:

  • Visualizar: soma 1;
  • Gravar: soma 2;
  • Visualizar e Gravar: soma 3;
  • Editar: soma 4;
  • Visualizar e Editar: soma 5;
  • Gravar e Editar: soma 6;
  • Visualizar, Gravar e Editar: soma 7;
  • Deletar: soma 8;
  • e assim por diante...

Agora para descobrirmos quais são os privilégios do usuário, podemos fazer uma consulta na listagem de privilégios (detalhe, acabei de pensar - e ainda estou agradecendo por este tópico existir -, ainda não testei) de maneira decrescente, 8, 4, 2 e 1.

 

Verificaremos cada privilégio, usarei o nível de permissão 11 como exemplo, se 11 for maior ou igual a 8, o usuário tem permissão para deletar, e se ele tiver permissão,terei de subtrair o valor de deletar do nível de permissão, pois se 11 >= 8, então, logicamente, 11 >= 4, 11 - 8 = 3, se o novo valor do nível de permissão (3) for maior ou igual a 4, o usuário tem permissão para editar, neste caso não tem permissão, manteremos o valor 3... se 3 for maior ou igual a 2, o usuário tem permissão para gravar, 3 - 2 = 1, se 1 maior ou igual a 1, o usuário tem permissão para visualizar.

 

Espero que entendam meu raciocínio, mas se alguém puder esclarecer melhor eu agradeço, kkkk.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Lokao, sem problemas cara pode se intrometer sim por que estou ficando doido em entender como isso funciona, no meu caso estou implementado em minha plataforma essa lógica mas para fins de aprendizado mesmo.

 

Vamos lá eu entendi mais ou menos a sua lógica, eu usei esse sistema de permissões em uma empresa, vou tentar explicar detalhadamente como estou tentando fazer.

 

O sistema funciona da seguinte maneira, tenho as telas e nelas o usuario pode editar, gravar, deletar o conteudo dela e visualizar e mais algumas outras permissões tipo desenhar na tela, bloquear algo validar sei la.. rsrs.

 

Ai neste caso eu criei 3 tabelas que são elas:

 

Tela

Regra

Acesso

 

Cada regra pertence a uma tela e o acesso a ela é baseado na soma de suas permissões

então na tabela acesso contem o id_grupo o id_tela e o nivel da regra que no caso é a soma.

 

O meu problema é como eu consigo saber, como é o calculo pra saber se o usuário pode Desenhar/Bloquear, Somente deletar, somente Visualizar/gravar basicamente isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como havia explicado, para você saber se o usuário tem acesso a deletar, você tem que saber se o nível de acesso é maior ou igual a 8, e de qualquer forma teria de checar se o usuário possui acesso aos demais privilégios.

 

No PHP eu faria assim:

if ( $valor_nivel_permissao >= 8 ) {
  $deletar = true;
  $valor_nivel_permissao -= 8;
}

if ( $valor_nivel_permissao >= 4 ) {
  $editar = true;
  $valor_nivel_permissao -= 4;
}

if ( $valor_nivel_permissao >= 2 ) {
  $gravar = true;
  $valor_nivel_permissao -= 2;
}

if ( $valor_nivel_permissao >= 1 ) {
  $visualizar = true;
  $valor_nivel_permissao -= 1;
}

Esse código serve apenas um esboço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então cara, o problema é que nesse caso ele pode ter niveis tanto acima como a baixo do deletar, vamos se por que eu queria ter somente visualizar e deletar um exemplo ai se eu usar essa lógica ele vai entender que eu tenho todas as permissões até o deletar :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, ficaria assim:

if ( $valor_nivel_permissao >= 8 ) { // 11 >= 8 ? verdadeiro
  $deletar = true;
  $valor_nivel_permissao -= 8; // 11 - 8 = 3
}

if ( $valor_nivel_permissao >= 4 ) { // 3 >= 4 ? falso
  $editar = true; // não entra
  $valor_nivel_permissao -= 4; // não entra
}

if ( $valor_nivel_permissao >= 2 ) { // 3 >= 2 ? verdadeiro
  $gravar = true;
  $valor_nivel_permissao -= 2; // 3 - 2 = 1
}

if ( $valor_nivel_permissao >= 1 ) { // 1 >= 1 ? verdadeiro
  $visualizar = true;
  $valor_nivel_permissao -= 1; // 1 - 1 = 0
}

Este exemplo exige que seja ordenado de forma decrescente, senão daria erro mesmo.

 

Outro exemplo, nível de acesso 7:

if ( $valor_nivel_permissao >= 8 ) { // 7 >= 8 ? falso
  $deletar = true; // não entra
  $valor_nivel_permissao -= 8; // não entra
}

if ( $valor_nivel_permissao >= 4 ) { // 7 >= 4 ? verdadeiro
  $editar = true;
  $valor_nivel_permissao -= 4; // 7 - 4 = 3
}

if ( $valor_nivel_permissao >= 2 ) { // 3 >= 2 ? verdadeiro
  $gravar = true;
  $valor_nivel_permissao -= 2; // 3 - 2 = 1
}

if ( $valor_nivel_permissao >= 1 ) { // 1 >= 1 ? verdadeiro
  $visualizar = true;
  $valor_nivel_permissao -= 1; // 1 - 1 = 0
}

Se não é o suficiente, nível de acesso 4:

if ( $valor_nivel_permissao >= 8 ) { // 4 >= 8 ? falso
  $deletar = true; // não entra
  $valor_nivel_permissao -= 8; // não entra
}

if ( $valor_nivel_permissao >= 4 ) { // 4 >= 4 ? verdadeiro
  $editar = true;
  $valor_nivel_permissao -= 4; // 4 - 4 = 0
}

if ( $valor_nivel_permissao >= 2 ) { // 0 >= 2 ? falso
  $gravar = true; // não entra
  $valor_nivel_permissao -= 2; // não entra
}

if ( $valor_nivel_permissao >= 1 ) { // 0 >= 1 ? falso
  $visualizar = true; // não entra
  $valor_nivel_permissao -= 1; // não entra
}
Ou até o exemplo de visualizar e deletar:
if ( $valor_nivel_permissao >= 8 ) { // 9 >= 8 ? verdadeiro
  $deletar = true;
  $valor_nivel_permissao -= 8; // 9 - 8 = 1
}

if ( $valor_nivel_permissao >= 4 ) { // 1 >= 4 ? falso
  $editar = true; // não entra
  $valor_nivel_permissao -= 4; // não entra
}

if ( $valor_nivel_permissao >= 2 ) { // 1 >= 2 ? falso
  $gravar = true; // não entra
  $valor_nivel_permissao -= 2; // não entra
}

if ( $valor_nivel_permissao >= 1 ) { // 1 >= 1 ? verdadeiro
  $visualizar = true;
  $valor_nivel_permissao -= 1; // 1 - 1 = 0
}

Somente como exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora intendi meu brother rsrsrs. Vai funcionar perfeito a forma que pensei aqui, assim que funcionar posto o código para você ver como ficou. Agradeço pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Lokao, funciono perfeitamente a sua lógica veja como fiz o algoritimo

 

Bom criei uma função que vai receber o nivel de acesso do usuário que ele pega no banco, ai passo esse nivel para a variavel $nivel e abaixo faço a operação

$nivel = 0;

foreach($this->acessos as $item)
{
    if($screen_id == $item->get('id_tela'))
    {
        $nivel = $item->get('nivel');
    }
}

$regra = new Regra();
$result = $regra->listAll("*", "WHERE id_tela = ".$screen_id." ORDER BY nivel DESC");

while($regras = mysql_fetch_array($result))
{
    $rl_nv = $regras['nivel'];
    
    if($nivel >= $rl_nv)
    {
        echo "<li><input type='checkbox' name='regras' value='".$regras[0]."' checked/>".$regras[1]."</li>";
        $nivel -= $rl_nv;
    }else{
        echo "<li><input type='checkbox' name='regras' value='".$regras[0]."'/>".$regras[1]."</li>";    
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.