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!