AuthComponent autenticação com CakePHP
Uma coisa bastante comum e e chata de fazer é em sistemas web/site é a área restrita. Verificar dados, criptografar, redirecionar, etc. Bom para quem utiliza o CakePHP podemos utilizar o AuthComponent
para facilitar todo este trabalho.
Para começar precisamos de uma tabela no banco de dados que irá armazenar nossos usuários que deve ter pelo menos os campos de usuário e senha,que será armazenada no formato sha256 e necessitará ser do tipo CHAR(64). A tabela abaixo deve servir!
CREATE TABLE usuarios ( id int(11) NOT NULL auto_increment, nome varchar(255) NOT NULL, login varchar(255) NOT NULL, senha char(64) NOT NULL, PRIMARY KEY (`id`) )
Criamos então o Model Usuario
<?php class Usuario extends AppModel { var $name = 'Usuario'; } ?>
Vamos então agora inserir o AuthComponent
em /app/app_controller.php
para podermos utilizá-lo em qualquer controller e fazer as configurações necessárias.
<?php class AppController extends Controller{ var $components = array('Auth'); function beforeFilter(){ if( isset( $this->params['admin']) ){ $this->layout = 'admin'; } //permitir todas as viwes que não sao administrativas if (!isset($this->params['admin'])) { $this->Auth->allowedActions = array('*'); } //configuração da autenticação Security::setHash('sha256'); $this->Auth->userModel = 'Usuario'; $this->Auth->fields = array('password' => 'senha','username' => 'login'); $this->Auth->authError = 'Área Restrita! Efetue login!'; // Mensagem ao entrar em area restrita $this->Auth->loginError = 'Nome de usuario ou senha não conferem!';// Mensagem quando não se autenticar $this->Auth->logoutRedirect = array('action' => 'login', 'controller' => 'usuarios','admin'=>1); $this->Auth->loginRedirect = array('action' => 'index', 'controller' => 'home','admin'=>1); } } ?>
Na linha 3 temos inserimos o AuthComponent
.
Na linha 5 declaramos o método beforefilter
que é um método que é executado antes de qualquer método de nossos controllers permitindo que as configurações de autenticação sejam sempre executadas antes da lógica de nossos controllers.
Nas linhas 6, 7 e 8 testamos se estamos em uma área administrativa, através do Routing.admin
configurado no core.php se for mudamos o template para o administrativo.
Por padrão o AuthComponent
protege todas os actions dos controllers então precisamos determinar quais estão liberados então nas linhas 11,12 e 13 verificamos se não estamos em uma área administrativa, ou seja não precisamos de autenticação e liberamos o acesso as actions não administrativas. Para liberar actions especifico basta colocar $this->Auth->allow('action1','action2','action3'...);
Na linha 16 configuramos o AuthComponent
para utilizar sha256 como algoritmo de hash para criptografar a senha. É importante ressaltar que para criptografar a senha ele utiliza o conteúdo do Security.salt
, então a senha armazenada no banco de dados será diferente para cada Security.salt
.
Uma dica para ver qual é o hash basta submeter o formulário de login com o debug de sql que ele irá mostrá-lo.
Na linha 17 configuramos para utilizar o model Usuario
que criamos e consequentemente a tabela usuarios
.
Na linha 18 configuramos o Authcomponent
para utilizar os campos login e senha da tabela.
Na linha 19 configuramos a mensagem de erro caso entre em uma área restrita.
Na linha 20 configuramos a mensagem de erro caso o login e senha sejam errados.
Na linha 21 configuramos a página para qual devemos redirecionar o usuário após ele realizar o logout.
Na linha 22 configuramos a página para qual iremos redirecionar o usuário após ele realizar o login com sucesso.
Agora podemos criar o nosso usuarios_controller.php
<?php class UsuariosController extends AppController { var $name = 'Usuarios'; public function admin_login() { $this->layout = 'login'; } function logout(){ $this->redirect($this->Auth->logout()); } function admin_add() { if (!empty($this->data)) { $this->Administrador->create(); $this->data['Usuario']['senha'] = $this->Auth->hashPasswords($this->data['Usuario']['senha']); if ($this->Administrador->save($this->data)) { $this->Session->setFlash(__('O Usuário foi salvo', true)); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('O Usuário não foi salvo.Tente novamente.', true)); } } } } ?>
No usuarios_controller.php
não precisamos fazer muita coisa, o AuthComponent
já fornece os códigos de login, basta para nós declará-lo, para o logout basta chamar $this->Auth->logout
que faz o logout e retorna a URL que é o caminho para onde o usuário deve ir após efetuar logout.
Para adicionar e editar o usuário devemos criptografar a senha, que é feito com o método $this->Auth->hashPasswords($senha);
como vista na linha 13, lembrando que o código de retorno deste método muda conforme a configuração do Security.salt
.
Agora vamos ao formulário de login que é bastante simples em /app/views/usuarios/login.ctp
.
<?php echo $session->flash('auth'); ?> <h2>Entrar</h2> <?php echo $form->create('Usuario' , array('action' => 'login')); echo $form->input('login'); echo $form->input('senha',array('type'=>'password')); echo $form->end('LOGAR'); ?>
Esse é um pequeno exemplo o AuthComponent
espero que ajude! Basta agora colocar o resto dos métodos do CRUD e seguir fazendo seu sistema administrativo.
Se você quiser liberar páginas especificas(controller e action) coloque o código baixo no app_controller especificando qual controller e action você quer liberar:
$this->Auth->allow(array('controller'=>'action'));
Paz e prosperidade!