Como criar um CMS completo com CakePHP – Parte 5 – Criando o sistema de login com bcrypt e lembrar de mim (segunda etapa) Artigo

Conheça os cursos gratuitos do WebDevBr! - Inscreva-se!


Este artigo foi publicado a 4 anos, 10 meses, 3 semanas, 1 dia atrás.

Bem, e agora pra fechar a parte 5 da série de artigos sobre como criar um CMS com CakePHP, vamos terminar o que começamos no artigo anterior.

Nele falamos sobre o Model Usuario e também já deixei pronto o CRUD do controller, agora vamos ver como será o login.

Antes de mais nada, se você não rodou o instalador no seu cms, agora é a hora, mas neste caso teremos uma pequena surpresa, nosso tema não puxa o  conteúdo, ele não tem essa função, por isso vá em app/View/Themed/Default/Layouts/default.ctp e substitua o conteúdo do arquivo por:

Gostou deste artigo?

Receba atualizações semanais com novos artigos do WebDevBr e outras dicas!

fetch('content'); ?>

E agora sim, rode o instalador, e quando terminar vamos abrir o nosso controller Usuarios (app/Controller/UsuariosController.php) e adicionar 2 novas actions e 2 novas funções internas.

Eu queria mostrar esse recurso de separar blocos de código no controller, por isso das funções, lembre-se, lógica vai no Model.

public function admin_login(){ }

public function admin_logout(){ }

protected function __criaLembrar($user){ }

protected function __logaLembrar(){ }

Ok, as duas primeiras estão setadas como public e portanto são as actions, já as duas ultimas, além de protected estão iniciadas com dois underlines (__) e portanto são apenas funções para uso interno, não da pra chama via url.

Na admin_login vamos adicionar:

if ($this->request->is('post') || $this->request->is('put')) { if ($this->Auth->login()) { //adiciona 1 acesso $this->Usuario->id=$this->Auth->user('id'); $this->Usuario->set('acessos',$this->Auth->user('acessos')+1); $this->Usuario->save();

  //seta o cookie para lembrar
  if($this->request->data['Usuario']['lembrar']==1)
    $this->__criaLembrar($this->Usuario->read());         

  $this->Session->setFlash(__('Logado com sucesso!'), 'sucesso');
  return $this->redirect($this->Auth->redirectUrl());
} else {
  $this->Session->setFlash(__('Usuário ou senha não encontrados, tente novamente ou verifique se sua conta está ativada!'), 'erro');
}

}else{ if($this->Cookie->check('lembrar')) $this->__logaLembrar(); }

Note que temos logo de cara uma checagem para saber se o formulário foi enviado (um post ou put) e caso seja enviado verifico se os dados enviados pode ser logados ($this->Auth->login()) , logo depois, em caso do usuário passar na verificação de login temos o bloco //adiciona 1 acesso que é fácil de ser interpretado vou deixar pra vocês estudarem, no //setar um cookie,  apenas verifico se o checkbox na view foi marcado e se foi autorizo eu chamo a função __criaLembrar e passo os dados do usuário logado para ela.

Caso o formulário não tenha sido enviado apenas chamo a função __logaLembrar().

A função __criaLembrar vai gravar um Cookie no computador do usuário com data de validade de 15 dias, com isso você não vai precisar logar no sistema, sempre que abrir a administração a função ++logaLembrar vai se encarregar de ler o Cookie e conceder o acesso se estes forem válidos, portanto, cole na __criaLembrar:

$user=$user['Usuario']; $user=array( 'id'=>$user['id'], 'user'=>$user['username'], 'pass'=>$user['password'] );

$this->Cookie->write('lembrar', $user, true, '2 weeks');

E na __logaLembrar:

$cookie=$this->Cookie->read('lembrar'); $this->Usuario->id=$cookie['id']; $user=$this->Usuario->read(); $user=$user['Usuario']; if($user['username']==$cookie['user']&&$user['password']==$cookie['pass']){ unset($user['password']); if($this->Auth->login($user)){ return $this->redirect($this->Auth->redirectUrl()); } }

A primeira é bem simples, apenas envio os dados e dou um Cookie->wirte, que grava o cookie com duas semanas de vida, depois disso ele expira e será apagado do computador do usuário.

A segunda é mais legal a função $Cookie->read le o Cookie lembrar que gravamos e armazena na variável lembrar, em seguida seta o id do usuário e armazena os dados dele na variável $User que em seguida, com isso temos o usuário que os dados do Cookie e também os do usuário, porém atualizados, o que fazemos é verificar se o usuário logado atualmente ainda tem os mesmos dados de acesso do Cookie se tiver ele vai logar o usuário e enviar para a administração, porém se não forem os mesmos dados ele simplesmente não faz nada e exibi a tela de login.

Porque isso, porque pode ser que você acessou o painel na casa de um amigo e deixou o campo lembrar marcado, então apenas trocando a senha você já impede que aquele Cookie funcione.

E por fim, a função de logout:

$this->Cookie->destroy('lembrar'); $this->redirect($this->Auth->logout());

Por fim, vamos colocar as views na pasta app/View/Usuarios, crie essa pasta e descompacte isso dentro.

Se você acessar agora o /admin vai ter uma série de mensagens de erro, isso porque apenas controlamos como vai funcionar o sistema de login, não configuramos para funcionar, abra seu AppController (app/Controller/AppController.php) e cole isso antes do  beforeRender:

public $components = array( 'Session', 'Cookie', 'Auth' => array( 'loginAction'=>array( 'admin'=>true, 'controller'=>'Usuarios', 'action'=>'login' ), 'authenticate'=>array( 'Blowfish'=>array( 'userModel' => 'Usuario', ) ), 'loginRedirect' => 'admin', 'logoutRedirect' => 'admin' ), );

function beforeFilter(){
  parent::beforeFilter();
  $this->Auth->allow(array('display','menu'));
}

Bem simples, temos a variável $components que carrega nossos componentes no CakePHP e a função beforeFilter que é executado antes de qualquer coisa na aplicação.

No primeiro chamamos 3 componentes, Session, Cookie e Auth, os dois primeiros é só chamar, já o Auth tem algums configurações, o LoginAction, informa aonde será o login, alí eu setei o prefix admin no controller Usuarios e a action login (não precisa no admin_ o prefix já vai setar isso), no authenticate eu informei ao Cake que estamos usando o sistema de encriptação bcryp (lembra no passo anterior que configuramos o salvamento da senha no model coma  função beforeSave) e também que vamos usar o Model Usuario, e por fim o loginRedirect e o logoutRedirect que diz o que será exibido quando fizermos o login e o logout, respectivamente.

No before filter eu permiti todas as actions display e menu da aplicação, o resto vai ficar protegido por usuário e senha.

A ultima coisa que falta fazer é na linha $this->set('user',array('id'=>1,'nome'=>'Erik')); do AppController.

Nesta linha vamos substituir o array('id'=>1,'nome'=>'Erik') por $this->Auth->User() que vai enviar os dados do usuário logado atualmente para a view, e se não tiver ninguám logado, teremos como resultado um false que diz para algumas partes da view não serem exibidas, como por exemplo do menu da administração.

Neste ponto você deve ser capaz de conseguir acessar sua administração sem problemas com o usuário e senha, outra coisa legal é que se você tentar acessar o instalador agora, não será capaz, ou seja, você pode remove-lo se quiser, ou deixar lá, ele tem recursos para impedir que dados sejam sobrescritos ou criados indevidamente.

Bem fechamos mais um tutorial da série de como criar um CMS, na próxima vou começar a criar o sistema de páginas


Cursos relacionados


* Parcelamento apenas cartão de crédito! Pode haver uma pequena variação no parcelamento em relação a simulações apresentadas!