CakePHP 3 — Acl Simples

Erik Figueiredo
3 min readJun 8, 2015

--

Muitos tem me questionado sobre como proteger a administração dos vários tipos de usuários logados, menus distintos para tipos diferentes de usuários, enfim, como identificar o tipo do usuário e tomar decisões baseadas neste tipo, não da pra ir a fundo no assunto aqui, mas posso ajudar você a tomar decisões simples, e isso já é muito, acredite.

Todo campo que você coloca na sua tabela de usuários fica disponível também na sessão do usuário logado, então imagine que você tem um campo chamado role que recebe valores numérios para cada tipo de usuário:

  1. Usuário comum
  2. Administrador
  3. Super-Administrador

Então imagine que o usuário comum não pode acessar administração e o administrador só não pode alterar a senha do super-administrador, o super-administrador pode tudo!

A primeira tarefa é liberar o acesso a administração apenas a usuários com role 2 e 3, bem simples, no seu AppController faça isso:

public function beforeFilter(Event $event)
{
$user = $this->Auth->user();
$prefix = null;
if (empty($this->request->params['prefix']))
$prefix = $this->request->params['prefix'];
if ($prefix === 'admin' and $user['role'] ==1)
throw new ForbiddenException('Não permitido');
/* o resto do seu código */
}

Então, você tendo os dados do usuário logado dentro da variável $user, e agora pode fazer o que quizer com isso e pronto! Eu verifiquei se o prefix é ‘admin’ (da administração), se for ele vai bloquear o acesso, acho que devia até verificar se o usuário está logado (neste caso o $user teria valor null e não um array), mas vou deixar você pensar nisso.

E na View? Existe o SessionHelper que você pode usar, mas se já tem os dados no Controller é melhor enviar de lá, né.

public function beforeFilter(Event $event)
{
$user = $this->Auth->user();
/* o resto do seu código */ $this->set(‘user’, $user);
}

E agora você também pode fazer o que quiser na view com a variável $user, que tal criar blocos de código especiais para cada usuário:

<?php if ($user[‘role’] == 1) : ?>
<! — HTML para usuário comum →
<?php else : ?>
<! — HTML para administrador e super administrador →
<?php endif; ?>

É simples, nem precisa explicar muito, e se você quiser pegar estes dados em outro lugar, qualquer um! Veja:

$session = new \Cake\Network\Session;
$user = $session->read(‘Auth.User’);

Podia ser na Model, ou aonde você precisar, e baseado nisso costruir suas próprias regras.

Como disse no começo do artigo, para soluções simples vai funcionar perfeitamente, como o exemplo que dei (com 3 níveis de usuário), poderíamos até verificar no beforeSave() se o role do usuário é 3 e o do usuário logado for 2 não permitir a alteração, ou melhor ainda, se o usuário logado tiver um role menor que o que ele quer salvar o beforeSave() retorna false e os dados não são salvos, enfim, lógica e raciocínio.

É claro, poderíamos criar uma administração ACL completa, mas ai eu não faria desta forma com certeza, quem sabe não sai algo sobre isso um dia!

Continue estudando

Aqui tem mais alguns artigos meus pra você ler.

--

--