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.
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.
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!
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??
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.
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
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?
Estou com o memso problema do douglas, poderia nos ajuda João?
Jeferson,
Habilite o debug do Cake e veja se algo de errado está acontecendo. Poste aqui o resultado.
Também não consegui
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
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!
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?
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!