O CakePHP é meu framework favorito. Com ele fazemos coisas complexas em poucos minutos. Tudo acontece de forma “automágica” se você seguir seu sistema de normalização. Neste tutorial vamos criar uma área administrativa em poucos minutos.

Área Restrita

Para criar nossa áera restrita vamos utilizar três recursos do CakePHP: Prefix Routing e AuthComponent.

Prefix Routing

A primeira coisa que precisamos fazer é criar uma rota para nossa área restrita. Simplificando o entendimento, o que vamos fazer é criar uma prefix routing chamada admin. Assim o cake desviará a url com este prefixo para a action que contenha o mesmo prefixo.

Por exemplo: a url http://seusite.com/admin/usuarios/ irá remeter ao controller usuarios, na action admin_index, chamando a view admin_index.ctp.

Vamos ativar esta funcionabilidade da seguinte forma:

1. Descomente no arquio /app/config/core.php a linha

2. Adicione no arquivo /app/config/routes.php

Pronto! Agora temos uma prefix routing configurada para nossa área restrita e podemos testa-lá. No entanto, para isso ainda precisamos:

3. Criar a action admin_index no controller page. (Se não existir o controlador em /app/controllers pegue-o em /cake/lib/controller)

4. Criar a view para esta action em /app/views/pages com o mesmo nome: admin_index.ctp

Acesse a url http://seusite.com/admin/pages/ e NENHUM erro deverá ocorrer. ^^’

Neste ponto, você já deve ter concluído que todas as actions da nossa área retrita precisarão conter o prefixo admin_. Além disso, também deve ter concluído que é possível também criar outros/quantos prefixos você desejar.

Agora vamos colocar a necessidade de autenicação para acessar as actions com o prefixo admin_.

Usuários

Antes de qualquer coisa, precisamos criar a tabela, o model, controller e as views parar gerenciar os usuários que acessaram nossa área restrita. Se isto já estiver pronto vá para o próximo tópico, se não, “vem comigo”: ^^

5. Crie a tabela Users

6. Utilize o Bake para criar o Model, Controller e as Views (Execute os comando na ordem que aqui estão apresentados)

Verifique se tudo esta funcionando perfeitamente. Entretanto ainda não cadastre nenhum usuáro, pois precisamos antes ativar o Auth Component para que ele faça o Hash da senha.

AuthComponent

O AuthComponent fará todo o tabalho duro para nós. Ele verificará as actions que necessitam de autenticação, se há usuario logado e tomar a decisão de liberar – ou não – o acesso.

Como peça fundamental, precisamos dele em todos os controllers da nossa aplicação. Tornaremos isso possível através da classe AppController que automáticamente o disponiilizará para todos os outros controllers.

7. Deixe o arquivo /app/app_controller.php com o seguinte conteúdo (Se este arquivo não existir, pegue-o na pasta /cake/libs/controller)

Agora precisamos criar as actions referente ao login e logout.

8. Abra o controller dos usuários (no nosso caso /app/controllers/users.php) e adicione antes da chave final:

9. Crie a view login.ctp (no nosso em /app/views/users)

A partir deste momento, se você tentar acessar a url que adiciona usuário (em nosso caso http://seusite.com/admin/users/add) você deverá ser redirecionado para a tela de login.

Notificações

Para que o cake exiba as mensagens de erro do Auth Component, você precisa alterar o arquivo resposável pelo layout das páginas – por exemplo /layout/default.ctp (Se este arquivo não existir, pegue-o na pasta /cake/libs/views/layouts/default.ctp) – e adicionar o seguinte código onde você desejar:

Primeiro usuário

Como o sistema está corretamente configurado, sem realizar o login é impossível cadastrar um novo usuário. Então faremos o seguinte, editamos o arquivo /app/app_controller.php e adicioamos antes da chave que fecha a função beforelter o seguinte:

Desta forma, agora podemos acessar diretamente a url http://seusite.com/admin/users/add para cadastrar um usuário. Faça isso e logo em seguida remova esta linha do app_controller.

Conclusão

Pela versibilidade do CakePHP, você pode fazer sua área restrita no começo ou durante o desenvolvimento de sua aplicação. Este é um sistema básico, que pode ser útil para algumas aplicações.

Se você deseja um sistema de permissão a nível de grupo/usuário, você pode ver meu tutorial Controle de Acesso a nível de grupo/usuario no CakePHP + ACL + Caching.

Termos de busca

Quer copiar esse post no seu site? Você pode!

Segundo a licença da Creative Commons 3.0 (CC BY SA 3.0) você pode copiar e distribuir esse conteúdo desde que faça menção ao autor original, para isso é só copiar esse código no final do artigo quando for publicá-lo em seu site:

<p>Artigo originalmente publicado em <em>6 de julho de 2011</em> por <strong><a href="http://pedroelsner.com/" title="Pedro Elsner, Profissional de TI - São Paulo">Pedro Elsner</a></strong>: <a href="http://pedroelsner.com/2011/07/criando-uma-area-restrita-no-cakephp/" title="Criando uma área restrita no CakePHP 1.3 + AuthComponent">Criando uma área restrita no CakePHP 1.3 + AuthComponent</a></p>
A não menção ao autor original da obra implicará em cópia e/ou distribuição ilegal de propriedade intelectual, o que é crime segundo a Lei n.º 9.610.
  • Pedrobms

    Pedro, tudo funcionou quase 100%. O único problema é que não consigo fazer o login, pois a senha gravada no banco não confere com o que eu informo no formulário de login. O que pode ser?

  • http://pedroelsner.com/ Pedro Elsner

    Faça o seguinte, edite a tabela ‘users’ alterando o campo ‘password’ para VARCHAR(100).
    Depois disso, altere o usuário cadastrando uma nova senha.

    No tutorial este campo estava como VARCHAR(20), o que ocorria em erro ao gravar a senha depois do hash, pois ela não cabia neste campo…

    Obrigado por avisar! Já atualizei o post.
    Tudo deve funcionar perfeitamente agora. =]

    Abraços

  • http://twitter.com/to_Systems Tylër

    O que não gosto deste método de login é que limita muito. Temos que ficar autorizando usuários e actions no código.
    Recomendo para sistemas de poucas paginas ou actions.

  • http://pedroelsner.com/ Pedro Elsner

    Você pode utilizar ACL e cadastrar perfis de grupos/usuários e gerenciar usando o banco de dados.
    É bem simples e fácil de implementar.

    Veja este tutorial: http://pedroelsner.com/2011/07/controle-de-acesso-a-nivel-grupo-usuario-no-cakephp/

  • gaijinboy

    Ola Pedro,
    Sou iniciante no cake.

    Aqui funcionou 100%, minha duvida e’ caso eu tenha admin de users, admin de videos, fotos e etc.
    Como que ficaria no routes.php ?admin/videosadmin/fotosadmin/usersAgradeco desde ja pela atencao.

  • http://pedroelsner.com/ Pedro Elsner

    Se eu entendi o que você disse, recomendo que utilize meu plugin AclCaching para gerenciar os controles de acesso para diferentes sessões.

    Veja este post: http://pedroelsner.com/2011/07/controle-de-acesso-a-nivel-grupo-usuario-no-cakephp/

  • http://twitter.com/EduardoSpek Eduardo Spek

    Estou aprendendo CakePHP e estou ficando fissurado nele, com seus tutoriais está me ajudando MUITO. Porém, estou tendo um problema: Quando cadastro um novo usuário a senha não vai criptografada para o banco, o que pode ser?

  • http://pedroelsner.com/ Pedro Elsner

    Legal Eduardo, CakePHP é ótimo e vai te ajudar muito! =D

    Verifique se no beforeFilter() do seu AppController esta com o seguintes códigos:
    ————
    // Método de Hash da senha
    Security::setHash(‘md5′);

    // Nome do modelo para os usuários
    $this->Auth->userModel = “User”;

    $this->Auth->fields = array(
    ‘username’=>’username’, // Troque o segundo parametro se desejar
    ‘password’=>’password’, // Troque o segundo parametro se desejar
    );
    ————

    Note que você deve configurar o modelo de Hash da senha, informar o nome do Modelo que você utilizará para login e informar quais são os campos de Usuário e Senha do seu Modelo.

    Se pretende fazer um controle de acesso recomendo esse tutorial: pedroelsner.com/2011/07/controle-de-acesso-a-nivel-grupo-usuario-no-cakephp/

  • EduardoSpek

    Resolvi, era no beforeSave, pra encriptar a senha antes. E também o campo da senha na tabela estava pequeno. Valeu! E parabéns, continue postando, valeu?! Grande abraço!

  • http://pedroelsner.com/ Pedro Elsner

    Legal Eduardo! =D
    Qualquer coisa é só falar! ^^

  • http://www.facebook.com/oficialDaniloMiguel Danilo Miguel

    Parabéns por seu tutorial. Trabalho com Cake a alguns anos mais nunca tinha utilizado esse Component. Fazia tudo na mão mesmo. Agora estou reorganizando um sistema que tenho e irei utilizá-lo. 
    Só fiquei com uma dúvida: no meu caso, eu gravo log’s do usuário no banco, inclusive do login. Tenho uma função para isso e outra para log’s errados. Como posso utilizar essas funções, uma vez que o login é todo automágico? Outra coisa, preciso salvar o tipo de usuário, o que determina o que ele pode acessar (tá bom, deu deveria usar ACL, mas não irei fazer nesse momento), mas não encontrei uma forma de fazer isso (gravar o tipo) e verificar o tipo de usuário para decidir se libera o acesso ou não. Pode me dar uma força? Ou pelo menos indicar onde encontro essas informações.
    Abraço.

  • http://www.facebook.com/oficialDaniloMiguel Danilo Miguel

    Achei a solução! Desabilita o $this->Auth->autoRedirect e depois coloca toda lógica necessária na função login().