Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lucaswxp

[TUTORIAL] - Utilizando o Auth Componente no CakePHP

Recommended Posts

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

Ótima serie de tutorias lucas

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.