13

Quem conhece o framework CakePHP (linguagem PHP) sabe que podemos ganhar muita agilidade de desenvolvimento com ele. Hoje veremos como implementar o componente Auth (autenticação) para gerir nosso sistema de login de usuários.

Tabela de Usuários

Começaremos criando a tabela usuarios que iremos usar em nosso modelo. Sinta-se livre para usar a tabela que quiser ou use o código SQL a seguir para criá-la:

CREATE TABLE IF NOT EXISTS `usuarios` (
  `id` int(11) NOT NULL auto_increment,
  `email` varchar(45) NOT NULL,
  `senha` varchar(40) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Modelo de Usuários

Criada nossa tabela de usuários, precisaremos escrever nosso modelo. Usaremos o modelo Usuario. Novamente, sinta-se livre para usar o quê lhe convir.

Se for usar nosso modelo, crie o arquivo usuario.php no diretório app/models/. Adicione o seguinte código ao arquivo:

<?php
class Usuario extends AppModel
{
	var $useTable = "usuarios";
	var $primaryKey = "id";
	var $displayField = "email";
}
?>

Agora nosso modelo está configurado.

Gerencia de Login em todo o Sistema

Queremos que o sistema de login de usuários esteja disponível em toda nossa aplicação. Para isso, implementaremos o componente Auth (autenticação) do núcleo do CakePHP em nosso AppController. Assim, todo o sistema estará gerenciado.

Para isso, abra o arquivo AppController.php localizado em cake/libs/controller/. Configure-o para usar os componentes Session e Auth através do código a seguir:

    var $components = array('Session', 'Auth');

Feito isso, precisamos definir as diretivas do componente Auth dentro da função callback beforeFilter do AppController. Sendo assim, ela será executada antes de qualquer função do controlador. Crie o método beforeFilter() com o código a seguir ou adicione apenas as diretivas à seu método já criado:

    function beforeFilter()
    {
        Security::setHash('sha1'); // substitua pelo hash que está usando
        $this->Auth->userModel = 'Usuario'; // nome do seu modelo de usuario
        $this->Auth->fields = array('username' => 'email', 'password' => 'senha'); // campos correspondentes a usuario e senha
        $this->Auth->authorize = 'controller';
        $this->Auth->autoRedirect = true; // auto redirecionar
        $this->Auth->loginAction = array('admin'=>false, 'controller' => 'usuarios', 'action' => 'login'); // controlador e action de login
        $this->Auth->loginRedirect = array('controller' => 'usuarios', 'action' => 'dashboard'); // controlador e action para enviar o usuario que entrou
        $this->Auth->logoutRedirect = array('admin'=>false, 'controller' => 'paginas', 'action' => 'index'); // controlador e action de logout
        $this->Auth->loginError = "Login inválido."; // mensagem de erro
        $this->Auth->authError = "Área restrita, por favor faça login."; // mensagem de acesso restrito
    }

Certifique-se que o nome do campo correspondente ao usuário e senha estejam definidos corretamente, assim como controladores, actions e modelo do usuário.´

Adicione também o seguinte código método ao AppController.php:

    function isAuthorized ()
    {
        return true;
    }

Pronto, seu AppController está configurado.

Controlador de Usuários

Precisamos configurar o controlador dos usuários. Nós usaremos o usuarios_controller.php. Sinta-se livre para usar o controlador que quiser. Adicione o seguinte código à ele:

	function beforeFilter ()
	{
		// executa o beforeFilter do AppController
		parent::beforeFilter();
		// adicione ao método allow as actions que quer permitir sem o usuário estar logado
		$this->Auth->allow('login');
	}

Agora a implementação do componente Auth, gerenciador do login de usuários, está concluída.

View de Login

Como já dito, a implementação já está concluída. Agora precisamos apenas criar a visão de login dos usuários. Nós usaremos a visão login.ctp no diretório app/view/usuarios/. Sinta-se livre para usar a view que desejar.

Adicione o seguinte código a ela:

<? if($session->check('Message.flash')) $session->flash() ?>
<? $session->flash('auth'); ?>
<?= $form->create('Usuario',array('controller'=>'usuarios','action'=>'login')) ?>
<?= $form->input('email',array('size'=>45)) ?>
<?= $form->input('senha',array('type'=>'password','size'=>30)) ?>
<?= $form->end("Login") ?>

Certifique-se de alterar os campos email e senha por seus campos correspondentes ao usuário e senha.

The End

Pronto, nossa gerência de login foi implementada e deve estar funcionando corretamente. Poste qualquer dúvida.




  1. Responder

    Olá João, tudo beleza?

    Estou começando com CakePHP. Eu vi seu tutorial, fiz tudo certo.

    Mas não estou conseguindo logar, ele criptografa a senha né?

    Como faço para cadastrar um usuario?

    Abraço.

    1. Responder

      Olá Mauricio,
      Sim, exatamente. O CakePHP vai criptografar as senhas de usuários cadastrados quando salvar no banco de dados. Além disso, ele também vai testar se a senha de login, criptografada, consta no banco.

      Sendo assim, você precisa cadastrar seu usuário no bd. Faz o seguinte, abre algum dos seus controladores e em alguma action escreve a seguinte linha de código:

      echo Security::hash(’sua_senha_secreta’, null, true);

      O CakePHP vai escrever na tela um hash de senha semelhante a esse:

      6051e859d4705e095b2b9743f19cda612a07324e

      Agora vá no seu banco de dados e cadastre seu usuário manualmente, utilizando em seu respectivo campo “senha” o hash que o Cake te forneceu. Feito isso, seu usuário está cadastrado corretamente e você poderá fazer login normalmente.

      Obs: para login, irá utilizar ’sua_senha_secreta’.

      Abraço,
      Espero ter ajudado!

  2. Responder

    Daew João…
    bem bacana esse teu post…. mas me diz uma coisa… tem alguma diferença entre o hash md5 do cake e do php puro??
    Tipo… eu fiz esse teste que tu sugeriu aí… e vi que não tá batendo os valores…
    Por exemplo:

    echo “MD5: “.md5(‘12345′); // retorna 827ccb0eea8a706c4c34a16891f84e7b
    echo “CAKE: “.Security::hash(‘12345′, null, true); // retorna fc1ce537d75600c45baa5b75b065ea9f

    depois de uns testes eu percebi que alterando o valor do salt para false (‘12345′, null, false), ele combinava, mas como que eu faço isso para a ação do login?
    Tipo, estou migrando uma app antiga, em php puro, para o cake e esse lance do login não tá rolando por causa disso..

    Tu pode me dar uma luz aew??

    1. Responder

      Fala Gabriel,
      Desculpe a demora para responder.

      Definindo Security::setHash(’sha1′); o CakePHP automaticamente irá converter as senhas entradas pelos usuários ao método de encriptação (sha1, md5, etc…) e comparar isso no banco de dados.

      Se sua dúvida persistir, pergunte novamente.

    2. Responder

      Fala Jow,

      Encontrei o mesmo problema que vc, consegui reverter isso comentando a seguinte linha do core.php (app/config/core.php):

      Configure::write(‘Security.salt’, ‘a8sdf87adsf89dsf4dsa65ads465asdf89dsa7ew’);

      []’s

  3. Responder

    amigo parabens pelo post ….
    fiz tudo correto só que a aplicação não faz o login e nem da nenhum erro.
    qual seria o problema?

    1. Responder

      Estou com o memso problema do douglas, poderia nos ajuda João?

      1. Responder

        Jeferson,

        Habilite o debug do Cake e veja se algo de errado está acontecendo. Poste aqui o resultado.

  4. Responder

    Também não consegui

  5. Responder

    Também aguardo a solução para este mesmo problema.
    Observei q o meu sistema nao estava salvando as informações no banco de dados criptografadas, esta salvando da maneira q eu escrevo, tentei tirar a linha “Security::setHash(‘md5′);” do beforeFilter no appConroler porém não surtiu efeito algum.

    gostaria de saber como todos como podemos resolver este problema que estamos tendo

    1. Responder

      Erlon,

      O problema pode estar ocorrendo devido a senha (entrada pelo usuário) não estar sendo encriptada antes de ser salva no banco de dados.

      Para solucionar o problema, faça o seguinte:

      1. É preciso encriptar a senha entrada pelo usuário antes de salvá-la no banco de dados. Para isso, adicione o código abaixo ao seu modelo de Usuários:

      // O quê eu faço antes de salvar um usuário
      function beforeSave()
      {
      if ( !empty($this->data[$this->alias]['SEU_CAMPO_SENHA_NO_FORM']) )
      $this->data[$this->alias]['SEU_CAMPO_SENHA_NO_BANCO'] = $this->passwordFormatBeforeSave($this->data[$this->alias]['SEU_CAMPO_SENHA_NO_FORM']);

      return true;
      }

      2. Adicione o método que o callback ácima irá executar para encriptar a senha do usuário em seu model de Usuários:

      // Formata senha antes de salvar
      function passwordFormatBeforeSave($password)
      {
      return Security::hash($password, null, true);
      }

      Espero ter ajudado,
      Abraço!

  6. Responder

    como faço pra executar alguma ação após o usuário fazer login? tipo, atualizar uma coluna data de último acesso no banco de dados?

    1. Responder

      Rodrigo,
      Isso pode ser feito de várias formas, uma delas é a seguinte:

      1. Desabilite o auto redirect do componente Auth adicionando a seguinte linha de código no seu app_controller.php:

      // Define-se que o componente Auth não redirecionará os usuários automaticamente
      $this->Auth->autoRedirect = false;

      2. Na action de login em seu controller (ex. UsuariosController, function login), insira o seguinte código:

      // Se o usuário se autenticou com sucesso
      if ( $this->Auth->user() ) {
      // Aqui insira a lógica que precisar executar antes de redirecioná-lo
      // Redireciona a página após o login
      $this->redirect($this->Auth->redirect());
      }

      Espero ter ajudado,
      Abraço!


Seu Comentário


Trackbacks

Trackback URL

Não existem trackbacks para este post.


Geeklove, expressando nossa Paixão em Código