Atenção! Para esse artigo julgo que os leitores já tem conhecimento básico sobre o framework.

Sem dúvida alguma, um dos princípios de segurança de um sistema é a restrição por login e para um sistema WEB esse cenário não é diferente tendo em vista que as aplicações ficam disponíveis por uma URL para todos na internet.

E para o que seria um trabalho duro e um pouco demorado da construção de toda uma regra, criptografia e esses tipo de coisas o CakePHP traz o Authcomponent que tem toda essa parte pronta e nós vamos nos preocupar em algumas poucas configurações em relação ao banco de dados e as permissões.

Sabendo disso, vou exemplificar o uso do componente através de um exemplo simples levando em conta que as normas do cake, como vínhamos sempre fazendo, tendo como foco demonstrar as funcionalidades básicas do componente. Não irei entrar em detalhes do mesmo, pois isso quebraria o nosso foco, caso depois de ler o artigo você queria saber mais sobre o componente você pode procurar no Manual do CakePHP.

Montando a tabela

Vamos começas pela estrutura do abanco de dados, criando a tabela de usuários, aqui vamos seguir como manda o cake, porém nada é obrigatório e tudo pode ser configurável, mas a termos de exemplo veremos o básico. Veja.

Listagem 1. Preparando a tabela de usuários


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;

Criando o Model e o Controller

As próximas linhas já são bem conhecidas, criaremos as classes Model e Controller para a tabela users seguindo as normas do cake.

Listagem 2. Criando o model e o controller


//model
class User extends AppModel{}
//controller
class UsersCotroller extends AppController{

  public function login(){}

  public function logout(){}

  public function areaPublic(){}

  public function areaRestrita(){}
  public funtion add(){
    if($this->request->is(“post”)){
      $this->User->save($this->request->data);
    }
  }

}

Crie o controller com algumas funções, nas quais apenas a add() tem um corpo mas as outras logo faram sentido, embora seja claramente perceptível os futuros usos delas.

Criando as Views

A criação das views também é um processo já trabalhado em outros artigos, então não vou descrever sua criação, vamos por logo a mão na massa.

Listagem 3.criando as views


//area_publica.ctp
<?php echo (“isso aqui qual quer pessoa pode ver”)?>
//area_publica.ctp
<?php echo (“isso aqui apenas pessoas logadas podem ver”)?>
//logout.ctp
<?php echo (“xau”) ?>

//login.ctp
<?php 
  <div class="users form">
    <?php 
    //definimos onde vão aparecer as mensagens enviadas pelo auth
    //fica disponível graças ao componente Auth que vamos adicionar logo logo.
     echo $this->Session->flash('auth'); 
   ?>
  <?php echo $this->Form->create('User');?>
    <fieldset>
        <legend><?php echo __('Login'); ?></legend>
    <?php
        echo $this->Form->input('username',array('label'=>'Usuário'));
        echo $this->Form->input('password',array('label'=>'Senha'));
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Login'));?>
</div>
//add.ctp
<div class="users form">
<?php echo $this->Form->create('User');?>
 <fieldset>
  <legend><?php echo __('Cadastrar'); ?></legend>
 <?php
  echo $this->Form->input('username');
  echo $this->Form->input('password');
?>
</fieldset>
<?php echo $this->Form->end(__('Cadastrar'));?>
</div>

Então, não fizemos nada novo até aqui. Criamos as views e colocamos algumas funcionalidades nelas. Só lembrando que casa view corresponde, nesse caso, a uma função publica da controladora.

Bem, terminamos a parte básica e você vai poder acessar as view do sistema, e verá que todas elas estão disponíveis para acesso, isso, logicamente, deve-se ao fato que não termos feito absolutamente nada.

O Authcomponent

Agora sim, depois de muita coisa que já vimos vamos ver a mágica acontecer com esse maravilhoso componente que você pode levar para casa inteiramente grátis basta baixar o CakePHP.

Ele já possui toda uma regra pronta para atender à quase todos os tipo de situações, como validações simples de apenas um nível ou com grupos de hierarquia.

O Authcomponent vem no pacote do cake, porem desabilitado. Para habilitá-lo realizar algumas configurações em AppController.php. Por padrão ele usa a tabela users e os campos username e password, o model user e controller users com a função login.

Vejamos como ficaria a configuração para nosso exemplo.

Listagem 4.Habilitando do authcomponent


/* note que estamos adicionando o componente Session que já vem habilitado, 
 mas ao adicionar  o auth ele deve ser habilitado também	*/
public $components = array(
 'Session',
 'Auth' => array(
   'loginRedirect' => array('controller' => 'users', 'action' => 'areaRestrita'),
   'logoutRedirect' => array('controller' => 'users', 'action' => 'logout),
   'authError' => 'Você deve fazer login para ter acesso a essa área!',
   'loginError'=> 'Combinação de usuário e senha errada!'
  )
);

Vejamos as configurações.

  • loginRedirect: Ação para onde será redirecionado o login bem sucedido.
  • logoutRedirect: Ação para onde será redirecionado após o logoff.
  • authErro: Mensagen que aparece caso você tente entrar sem permissão.
  • loginError: Mensagem para erro na combinação de login.

Existem ainda muitas outras configurações mas para esse exemplo essas bastam.

Agora, vamos novamente tentar acessar as views, por exemplo add.ctp. Veja que eu falei “tentar”, porquê você não vai conseguir, na verdade você foi redirecionado para a view de login.

Mas isso é muito ruim, pois não temos nenhum usuário cadastrado. Verdade, então vamos fazer mais algumas configurações em AppController.php.

Permissões

O que devemos fazer para nosso caso é simples, basta darmos permissão para usuários não logados terem acesso às actions que devem ser públicas, no nosso caso add e areaPublica.

Podemos fazer isso através do array allow do authcomponent, sobre escrevendo o metodo beforeFilter de Controller, da seguinte forma:

Listagem 5: adicionando permissões


  public function beforeFilter(){
    //cada posição do array será uma ação publica
    $this->Auth->allow = array(“add”,”areaPublica”);
  }	

O metodo beforeFilter pode ser sobre escrito tanto em AppController quanto em UsersController, nesse caso, de sobre escrita em controlles específicos, as regras farão efeito para apenas as actions desse controller, no caso de sobre escrita em AppController as regras farão efeito sobre todas as actions com aqueles nomes em todos os controller, quem deverá definir o melhor caso é você e a regra de negócio do seu projeto.

Feito isso podemos acessar a view de cadastro, criar um novo usuário e finalmente ver a mensagem da areaRestrita.

Coisas que você vai querer saber

O cake usa uma string, uma especie de chave, para fazer o hash das senhas do authcomponent, ela vem com um padrão mas é recomendado que você altere para qualquer coisa, o mais aleatório possível.

O arquivo é /app/Config/core.php na linha 187.

Listagem 6: trecho do aquivo core.php


/**
 * A random string used in security hashing methods.
 */
Configure::write('Security.salt', 'DYhG93b0qeqerqewrAWBHDH878*(&*&yJfIxfs2');	

Você pode, em algum momento, querer saber algum dado do usuário logado, para isso usamos o método user() do authcompoment nos controller ou Authcompoment::user() em qualquer parte do projeto.

Listagem 7: usando o metodo user


$this->Auth->user('username');//vai retornar o nome do usuário logado.	

Bem galera, por enquanto é isso, espero que tenham gostado e caso tenham ficados curiosos, o que eu espero muito, deem uma passadinha no manual do cake que tem muita coisa sobre esse poderoso componente, como ACL por exemplo e outras coisinhas mais que demoraria muito para explicar tudo aqui.

Obrigado e até a próxima.