Sistema de login com CakePHP e AuthComponent

Fala pessoal, tudo bom?

Hoje vou tentar explicar pra vocês como configurar o AuthComponent do CakePHP pra criar um sistema de login bem simples mas muito eficiente.

Na minha opinião, o maior problemas de usar o Auth em um sistema/aplicação em português é que seu Model de usuários vai se chamar “Usuario”, “Cliente” ou “Administrador” * e não “User”, então você precisa mudar algumas configurações pra ele [o Auth] funcione de acordo.

* Esses níveis de acesso não deveriam definir o nome do model, que ainda é apenas um usuário.

Tabela de usuários (clientes)

Se você já tem um model/tabela de usuários pode pular para o próximo passo. Se você ainda não tem, essa é uma estrutura que eu recomendo pra quem usar MySQL:

1 CREATE TABLE `clientes` (
2 `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
3 `nome` VARCHAR( 100 ) NOT NULL ,
4 `email` VARCHAR( 150 ) NOT NULL ,
5 `senha` CHAR( 40 ) NOT NULL ,
6 `ativo` BOOLEAN NOT NULL DEFAULT '0',
7 INDEX ( `email` )
8 ) ;

Habilitando o AuthComponent

Recomendo que você insira o componente no seu AppController pois toda a aplicação será controlada/protegida pelo AuthComponent.

Edite (ou crie) o arquivo /app/app_controller.php e defina os componentes que você quer usar, no final da lista coloque o Auth:

1 class AppController extends Controller {
2
3 // Componentes utilizados por toda a aplicação
4 public $components = array('Session', 'Cookie', 'Auth');
5
6 }

Agora começa a parte de configuração e comunicação com o seu model de usuários, administradores ou seja lá qual for o nome.

Configurando o AuthComponent

Ainda dentro do seu AppController você vai configurar o componente dentro de um método (callback) chamado beforeFilter, da seguinte maneira:

01 <?php
02
03 class AppController extends Controller {
04
05 public $components = array('Session', 'Cookie', 'Auth');
06
07 public function beforeFilter() {
08
09 // Model de usuários
10 $this->Auth->userModel = 'Cliente';
11
12 // Campos de usuário e senha
13 $this->Auth->fields = array(
14 'username' => 'email',
15 'password' => 'senha'
16 );
17
18 // Condição de usuário ativo/válido (opcional)
19 $this->Auth->userScope = array(
20 'Cliente.ativo' => true
21 );
22
23 // Action da tela de login
24 $this->Auth->loginAction = array(
25 'controller' => 'clientes',
26 'action' => 'login'
27 );
28
29 // Action da tela após o login (com sucesso)
30 $this->Auth->loginRedirect = array(
31 'controller' => 'clientes',
32 'action' => 'home'
33 );
34
35 // Action para redirecionamento após o logout
36 $this->Auth->logoutRedirect = array(
37 'controller' => 'pages',
38 'action' => 'display', 'home'
39 );
40
41 // Mensagens de erro
42 $this->Auth->loginError = __('Usuário e/ou senha incorreto(s)', true);
43 $this->Auth->authError = __('Você precisa fazer login para acessar esta página', true);
44 }
45
46 }

Com essas configurações definidas o sistema de login está praticamente pronto! :)

Criando as actions de login e logout

Para criar o formulário de login você precisa definir aquela action de login que você especificou ali em cima, na opção loginAction (linha 24), por exemplo:

Se o nosso model de usuários se chama Cliente, então nossas actions de login e logout estarão no controller de Clientes:

01 <?php
02
03 class ClientesController extends AppController {
04
05 public function login() { }
06
07 public function logout() {
08 // Redireciona o usuário para o action do logoutRedirect
09 $this->redirect($this->Auth->logout());
10 }
11
12 }

A action de login fica vazia mesmo, e a action de logout apenas redireciona o visitante para a action definida lá no logoutRedirect (linha 36).

Fomulário de Login

view do formulário de login é extremamente simples e (segundo o nosso exemplo) vai no arquivo /app/views/clientes/login.ctp:

1 <?php $this->Session->flash('auth') ?>
2
3 <?php $this->Form->create('Cliente', array('action' => 'login')) ?>
4 <?php $this->Form->input('email') ?>
5 <?php $this->Form->input('senha', array('type' => 'password')) ?>
6 <?php $this->Form->end('Entrar') ?>

Primeiro nós temos o Session->flash() que irá exibir as mensagens de erro de autenticação (senha inválida, página restrita e etc.)

Depois nós usamos o FormHelper para criar o formulário de login (apontando pra action de login) com os campos de email e senha! :)

Criando seu primeiro usuário

Feito isso o seu sistema de login está pronto mas você precisa criar um usuário para testá-lo, e fazer isso direto no banco de dados não vai funcionar!

Quando você instalou o CakePHP ele deve ter pedido para você modificar a configuraçãoSecurity.salt, lá na linha 204 do arquivo /app/config/core.php, esse valor é utilizado na hora de encriptar a senha de um usuário antes de salvá-lo no banco de dados e consequentemente também é utilizado na hora de você fazer o login. Por isso é o CakePHP quem precisa criar esse usuário no banco de dados, não adianta tentar fazer isso diretamente no banco.

Para criar um usuário é bem simples: é só você fazer isso dentro de alguma action (de algum controller) do CakePHP, utilizando o método save() do seu model de usuários, por exemplo:

01 // Carrega o model de clientes
02 $this->loadModel('Cliente');
03
04 // Cria um novo cliente
05 $this->Cliente->create();
06 $this->Cliente->save(array(
07 'nome' => 'Thiago Belem',
08 'email' => 'contato@thiagobelem.net',
09 'senha' => $this->Auth->password('123456'),
10 'ativo' => true
11 ));

Esse código pode ir dentro do método beforeFilter do seu AppController (após as instruções de configuração do AuthComponent… Mas execute esse código apenas uma vez! Cada vez que esse código for executado o CakePHP irá tentar criar um novo usuário. Execute, verifique no banco de dados se o usuário foi criado e delete o código.

Perceba que utilizamos o método Auth->password() que faz exatamente o que expliquei ali em cima, utiliza o Security.salt para encriptar a senha passada.

Protegendo apenas um prefixo (opcional)

Agora todo o seu sistema estará “bloqueado”, e você precisa fazer login para acessar qualquer tela.

Caso você queira proteger apenas um prefixo (como por exemplo: admin) e não exigir login enquanto o usuário não estiver acessando um action com esse prefixo, coloque o seguinte código após a configuração do AuthComponent:

1 if (!isset($this->params['admin']) || !$this->params['admin'])
2 $this->Auth->allow('*');

Isso fará com que o Auth permita acesso à qualquer action quando você não estiver dentro do um prefixo “admin”.

Você também precisará mudar algumas configurações do Auth:

01 // Action da tela de login
02 $this->Auth->loginAction = array(
03 'admin' => false,
04 'controller' => 'clientes',
05 'action' => 'login'
06 );
07
08 // Action da tela após o login (com sucesso)
09 $this->Auth->loginRedirect = array(
10 'admin' => true,
11 'controller' => 'clientes',
12 'action' => 'home'
13 );
14
15 // Action para redirecionamento após o logout
16 $this->Auth->logoutRedirect = array(
17 'admin' => false,
18 'controller' => 'pages',
19 'action' => 'display', 'home'
20 );

Essa mudança é necessária pois você precisa sair e entrar do prefixo “admin” antes e depois do login/logout.

Pronto! :)

Parabéns, você acaba de fazer um sistema de login utilizando CakePHP! Onde o maior trabalho (na minha opinião) foi criar o usuário, pois configurar o AuthComponent e criar o formulário de login é extremamente simples.

Quer saber mais sobre o CakePHP?

Assando Sites, curso online de CakePHP

Inscreva-se no meu curso online de CakePHP, o Assando Sites!

Você aprende sem sair de casa, aos domingos ou quando preferir assistir os vídeos gravados em aula. :)

Para saber mais informações sobre o curso, acesse o site ou leiaeste post aqui no blog.

Um grande abraço e até a próxima!

 

 

Artigo originalmente publicado em 15 de agosto de 2011 por Thiago Belem: Sistema de login com CakePHP e AuthComponent

1 Comments

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="">

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.