lucaswxp 22 Denunciar post Postado Outubro 19, 2009 Olá galera! Mais um tutorial sobre cakephp para vocês, e agora ensinarei a utilizar um dos recursos mais procurado no Cake: o Auth Componente! Uma coisa que era muito chato no desenvolvimento de uma App era fazer o sistema de login. Ter que ficar verificando se o usuário preencheu tudo certinho, criptografar senhas, validar e etc... Mas agora isso acabou. Com o Auth Componente tudo fica mais fácil, o cake faz praticamente tudo sozinho e mais! Veremos como fazer um simples, porém eficaz, sistema de login utilizando este componente. Pré-requisitos * Conhecimento básico sobre o framework CakePHP Conteúdo Vamos começar modelando nossa tabela da base de dados. O CakePHP espera que tenhamos uma tabela chamada "users" com pelo menos 3 campos: id, username e password. Um detalhe: a senha estará no formato de hash (sha256), por este motivo deixaremos o campo password com o tipo 64 CHAR. Vamos criar a tabela e já inserir um usuário nela. CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `username` varchar(255) default NULL, `password` char(64) default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO `users` VALUES (1,'admin','2d02f2e3ed7978d0d89e13f1173bb5cdd580242ae01e3a764c40cdd6b53faf86'); // Usuario: admin Senha: admin Vamos criar agora o model, controller e um view: UsersController: <?php class UsersController extends AppController { var $name = 'Users'; function area_restrita(){ } } ?> User Model: <?php class User extends AppModel { var $name = 'User'; } ?> area_restrita.ctp: <p>Você só verá isso se estiver autenticado.</p><br /> <?= $html->link('CLIQUE AQUI PARA SAIR' , array('controller' => 'users' , 'action' => 'logout')); ?> Até aqui ainda não fizemos nada referente a autenticação (exceto a tabela). Também criamos um link no view "area_restrita", explicarei sobre ele depois. Vamos agora adicionar o Auth Componente em nossa App e dizer qual algoritmos iremos utilizar. Iremos adicionar em app_controller, para assim, todos os controllers filhos também exigirem que o usuario de logue antes de visualizar qualquer coisa. <?php class AppController extends Controller { var $name = 'App'; var $components = array('Auth'); function beforeFilter(){ Security::setHash('sha256'); // Setamos o algoritmo que iremos utilizar, o padrão é sha1 } } ?> Aqui incluímos o componente de autenticação na propriedade $components, assim fazendo que todas as actions de todos os controllers exijam autenticação. E logo depois definimos um método chamado "beforeFilter", este método será chamado antes de qualquer view ou action ser processada e renderizada. E dentro deste método setamos qual algoritmos iremos utilizar, aqui estamos utilizando "sha256" que gerará um hash com tamanho de 64 caracteres. Os valores aceitos são: md5, sha1 e sha256. Lembre que qualquer configuração deverá ser feita em "beforeFilter". Agora, toda vez que formos entrar numa action, o componente nos redirecionará para a action "login" do controller "users" - este é o padrão, é possivel alterar, falarei disso mais a frente. E método "logout", lembra que no view "area_restrita" tem um link que aponto para a action "logout" do controller "users"? Portanto temos criar a action "login" e "logout", então faremos isso: <?php class UsersController extends AppController { var $name = 'Users'; function area_restrita(){ } function login(){ } function logout(){ $this->redirect($this->Auth->logout()); // Efetuamos logout } } ?> Nos definimos a action login que fará todas as validações necessárias automaticamente. E logo após definimos a action responsavél por efetuar logout. Nós utilizamos o método Auth::logout(). Este método efetua logout e retorna uma string, esta string é o caminho para onde o usuario deve ir após efetuar logout (por padrão é "users/login"), e logo após nos utilizamos o metodo Controller::redirect() para manda-lo para este local. Quando o usuario enviar as informações o cake automaticamente gerará os hashes das senhas vindas do formulário, comparará com as da tabela e etc, portanto não é necessário fazer nada!Nosso sistema já esta quase completo, só falta o view responsavel pelo formulario de login.login.ctp: <h2>EFETUE LOGIN!</h2> <?php $session->flash('auth'); // Exibimos qualquer erro que possa ter ocorrido echo $form->create('User' , array('action' => 'login')); echo $form->input('username'); echo $form->input('password'); echo $form->end('LOGAR'); ?> Nosso pequeno sistema de autenticação está terminado. Se você tentar entrar em algum action sem se autenticar acontecerá o seguinte: E se tentarmos inserir informações invalidas: [image] Opa! Perai, isso não está em nosso idioma, vamos fazer algumas modificações em AppController: <?php class AppController extends Controller { var $name = 'App'; var $components = array('Auth'); function beforeFilter(){ Security::setHash('sha256'); // Setamos o tipo de hash que iremos gerar $this->Auth->authError = 'Area 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 } } ?> E: [image] AH! Agora sim, tudo em português =D Nosso sistema já está complete, mas passarei alguns métodos "extras" que podem ser muito uteis em algumas situações. Extras 1 - Toda vez que você acessa uma action que necessita de autenticação, o cake armazenará em memória qual era a action que você estava tentando acessar, para quando você logar-se, ser redirecionado para tal action. Algumas vezes, quando você vem de um link externo por exemplo, é necessário setar um caminho padrão, este caminho pode ser definido pela propriedade Auth::loginRedirect. $this->Auth->loginRedirect = array('action' => 'area_restrita', 'controller' => 'users'); 2 - O mesmo para logout. Por padrão, ao efetuar logout o metodo Auth::logout() deixará uma string que indicará o caminho para o qual o usuario deve ir ao sair. Você também pode alterar pela propriedade Auth::logoutRedirect: $this->Auth->logoutRedirect = array('action' => 'algumaAction', 'controller' => 'users'); 3- Quando você seta na propriedade $components o que irá utilizar o componente "Auth", isso já faz que todas action que o usuario tentar acessar sejam protegidas, assim redirecionando o usuário para o local de login. Você pode querer que algumas action não necessite autenticação, como por exemplo a index do site. É possível "desprotegê-la" colocando o nome da action no método Auth::allow(). Veja um exemplo: $this->Auth->allow('index' , 'action2' , 'action3'); 4 - Por padrão o cake assume que você terá um model "User" que tratará da tabela "users", é possível alterar isso também: $this->Auth->userModel = 'Usuario'; Também é possível alterar os nomes dos campos de nome de usuario (username) e senha (password), basta criar um array associativo para a propriedade Auth::fields. $this->Auth->fields = array( 'password' => 'senha', 'username' => 'login' ); 5 - Você pode querer, em algum momento de sua aplicação, resgatar algum dado do usuario, você pode fazer isso com o método Auth::user('nome do campo da tabela') $this->Auth->user('idade'); 6 - Algumas vezes você pode querer fazer alguma validação adicional, como verificar se o usuário esta marcado como ativo na tabela, você pode fazer isso utilizando a propriedade Auth::userScope. $this->Auth->userScope = array('User.ativo' => 1); Ainda existem muitos outros métodos e propriedades, mas estes são os mais utilizados. E lembre-se que o métodos/propriedades referente a configuração, devem estar dentro do método beforeFilter. FONTE: http://lucaspelegrino.com/ Compartilhar este post Link para o post Compartilhar em outros sites
Mário Monteiro 179 Denunciar post Postado Dezembro 20, 2009 Ótima serie de tutorias lucas Compartilhar este post Link para o post Compartilhar em outros sites
lucaswxp 22 Denunciar post Postado Dezembro 22, 2009 Ótima serie de tutorias lucas Opa! Vlw :) Compartilhar este post Link para o post Compartilhar em outros sites
etapombas 0 Denunciar post Postado Janeiro 12, 2010 Cara eu usava o othAuth na versao 1.1.19, agora que migrei para 1.2 estou com uma dificuldade super básica. A sessão do login vive caindo, já setei security low, 3200 segundos e nada..... Basta ficar um tempo parado e dar refresh que o login expira, mas se fico os mesmos 10 minutos e clico num link o login nao cai sabe me ajudar? abs Compartilhar este post Link para o post Compartilhar em outros sites
lucaswxp 22 Denunciar post Postado Janeiro 12, 2010 Eu lembro que você tinha feito um topico, porém é realmente muito estranho.... o.O Talvez seja a instalação... mas acho improvavel =/ Poste o seu codigo lá naquele topico para ver se podemos fazer algo. Compartilhar este post Link para o post Compartilhar em outros sites
maubiasotto 0 Denunciar post Postado Janeiro 25, 2010 Vou fazer um site aonde tera acesso livre e um painel administrativo aonde será autenticado o acesso. Como que faço para as páginas do site ficar livres, desprotegidas? Uso assim '$this->Auth->allow('index' , 'action2' , 'action3');' Não tem como fazer algo automatico, só as página do /admin ficar protegidas e a do site livre? Valeu Compartilhar este post Link para o post Compartilhar em outros sites
etapombas 0 Denunciar post Postado Janeiro 25, 2010 Tem sim, é bem fácil Dentro do app_controller, adicione essa lina no beforeFilter /* isAuthorized */ $this -> Auth -> authorize = 'controller'; Depois crie uma função fora do beforeFilter : function isAuthorized() { $group_id = $this -> Auth -> user('group_id'); if (isset($this -> params[Configure::read('Routing.admin')])) { if ($group_id == 1 or $group_id == 2) { return true; } else { return false; } } else { return true; } } Assim voce indica que quem vai gerenciar as permissoes é o controlador, e na funcao isAutorized você esta indicando que tudo dento de /admin só pode ser acessado por usuários do grupo 1 ou 2 Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Outubro 18, 2010 Lucas, já que este é um tutorial, então acho que o que vou postar não é flood... Bom, gostaria que você me ajudasse a adaptar o método isAuthorized à além de ler os controllers, poder recuperar os títulos e as imagens deles na tabela permissions no BD, pois eu criei um menu com listObjects() mas este me vem em inglês (o nome dos controllers é em inglês) e ainda vem todos os controllers de uma vez, e não apenas os principais ( exemplo: enquetes, votos das enquetes, opções das enquetes ) Compartilhar este post Link para o post Compartilhar em outros sites
michel kafury 1 Denunciar post Postado Setembro 3, 2013 tentei fazer isso em minha aplicação e não deu certo. só fica no form de login! segue meus codigos: http://pastebin.com/zTA6MNGi Compartilhar este post Link para o post Compartilhar em outros sites