Boteco Digital

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.

[EDIT 2011-05-30]
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'));

[/EDIT]

Paz e prosperidade!

Categorias PHP
comments powered by Disqus