No meu tutorial Criando uma área restrita no CakePHP 1.3 + AuthComponent vimos como é fácil implantar o sistema de autenticação “nativo” do CakePHP. Agora iremos além, faremos uma área restrita com nivel de permissão grupo/usuário.

Para isso utilizaremos alguns plugins, que facilitaram todo o processo. Recomendo que você veja o tutorial sobre o assunto existente no CookBook. Assim, você entenderá melhor como funciona o Acl Component, o qual fará toda a mágica desta vez.

Iniciando

Neste tutorial utilizaremos alguns recursos do CakePHP: Prefix Routing, Auth Component, Acl Component, um Método de Callback, Behaviors e Plugins.

Acl Component

O significado de ACL, traduzindo a sigla, é lista de controle de acesso. Utilizando uma estrutura de árvore para controle, este componente nos permite realizar o controle de acesso de grupos e usuário a cada action do sistema.

Ele trabalha com duas árvores: ACO e ARO.

ACO (Controle de Acesso de Objetos) = Controllers e Actions

ARO (Requisição de Acesso a Objetos) = Grupos e Usuários

Vamos utilizar dois plugins: Alc_Extras e ACL_Caching – este eu desenvolvi ^^’.

Preparação

O Acl Component trabalha em conjunto com o Auth Component. O segundo faz a parte de autenticação e o primeiro libera o acesso específico para grupos e usuários.

Para facilitar, iniciaremos um novo projeto e iremos configura-lo. Não mostrarei com muitos detalhes como configurar o Auth Component, sendo assim mostrarei apenas os arquivos e modificações, uma vez que você pode encontrar toda a explicação que precise neste tutorial.

1. Remova o comentário do arquivo /app/config/core.php na linha

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

3. Crie a Action admin_index no Controller page. (Se não existir pegue-o em /cake/lib/controller/pages_controller.php)

4. Crie 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.

Agora vamos criar as tabelas, Models, Controllers e as Views para nossos grupos e usuários

5. Crie as tabelas: Groups e Users

6. Utilize o Bake ou Bake UTF8 (outro plugin que desenvolvi) para criar o Model, Controller e as Views (execute os comando abaixo na ordem em que estão apresentados):

Instalação dos plugins

Antes de iniciar, vamos instalar os dois plugins: Acl_Extras e ACL_Caching. Para isto, basta fazer o download e copia-los para a pasta /app/plugins com os nomes acl_extras e acl_caching, repectivamente.

Se preferir, utilize o git:
git clone https://github.com/pedroelsner/acl_caching.git
git clone -b 1.3 https://github.com/markstory/acl_extras.git

Agora através de um comando de shell, no estilo Bake, vamos criar as tabelas no banco de dados necessárias para o funcionamento do Acl Component.

Este comando irá criar as tabelas acos, aros e acos_aros, que são responsáveis por armazenar os Controllers/Actions, os grupos ou usuários e a ligação de permissão que grupos/usuários tem com os Controllers/Actions.

Para gerar a lista de Controllers e Actions da nossa aplicação, vamos utilizar o plugin acl_extras com o seguinte comando shell:

Sempre que você adicionar, remover ou alterar o nome de algum Controller ou Action, basta rodar este comando para sincronizarmos a tabela acos. =] (Não precisa agradecer!) rs

Performance

Recomendo a leitura do meu tutorial Problema de performance com CakePHP 1.3 + ACL para criar os índices necessários no seu banco de dados para obter mais velocidades nas consultas das permissões.

Configurações

Agora com os plugins instalados, vamos configurar nossa aplicação:

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)

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

9. Vamos atualizar nossa lista de ACO porque acabamos de adicionar 2 novas Actions no sistema:

10. Crie a View login.ctp (no nosso em /app/views/users)

Notificações

Para que o Cake exiba as mensagens de erro do Auth Component, você precisa alterar o arquivo esposá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:

Behaviors Callback

Como vimos anteriormente, a tabela Aros é responsável por armazenar os grupos e usuários. Estas entradas se relacionam com a tabela acos que contem todos os Controllers e Actions da nossa aplicação.

Iremos agora criar funções de callback no model group e user para que quando adicionados, alterados ou excluídos, a tabela Aro seja atualizada automaticamente.

11. Edite o arquivo /app/models/group.php e adicione:

12. Edite o arquivo /app/models/user.php e adicione:

Primeiro grupo e usuário

Agora que os Behaviors estão devidamente configurados, vamos adicionar nosso primeiro grupo e usuário. Porém, para isso precisamos liberar acesso para as páginas de cadastro. Faremos isto da seguinte forma:

13. Edite o arquivo /app/app_controller.php removendo o comentário da seguinte linha:

14. Acesse http://seusite.com/admin/groups/add e cadastre um grupo.

15. Acesse http://seusite.com/admin/users/add e cadastre um usuário.

Definindo permissões

Agora a mágica vai acontecer de verdade. =]

Com o grupo e usuário adicionados, vamos definir suas permissões de acesso. Para isso, acesse a url http://seusite.com/admin/acl_caching/acl/ e uma tela como esta irá abrir:

Por padrão, o ACL nega tudo e você concede a permissão para o que desejar.

Para liberar, basta você clique sobre a regra desejada e um carregamento em Ajax ira acontecer. Caso um item de exclamação apareça, significa que o ACO da action não esta cadastrado no banco de dados, sendo assim, execute o comando cake acl_extras aco_sync para atualizar o banco de dados.

Acl Caching

Modéstia parte, este plugin é incrível, ele faz cache das permissões em uma sessão no momento do login e utiliza um modelo pronto, intuitivo e simples para alterar as definições de permissões de acesso para todos os grupos de usuários.

Além disso ele conta com funções especiais e um Helper para tratar os links de forma diferenciada.

Recomendo a leitura do tutorial Utilizando o Plugin ACL Caching no CakePHP 1.3 para conhecer todas as suas vantagens.

Finalizando

Depois de atribuir a permissão dos grupos de usuários, blindaremos o sistema forçando o login.

17. Edite o arquivo /app/app_controller.php e comente a seguinte linha:

Conclusão

O CakePHP é muito versátil e intuitivo. De forma simples e prática, implementamos uma área restrita com nível de permissão de grupos e usuários. Fazer este sistema em PHP puro daria um trabalho danado…

Em caso de dúvidas deixe um comentário. ^^

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>15 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/controle-de-acesso-a-nivel-grupo-usuario-no-cakephp/" title="Controle de acesso a nível grupo/usuário no CakePHP 1.3 + ACL + Caching">Controle de acesso a nível grupo/usuário no CakePHP 1.3 + ACL + Caching</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.
  • Bruno Marques

    Pedro.. Bom??

    To tentando seguir seu tutorial, muito bem explicado diga-se de passagem, mas quando rola o /cake acl_extra aco_sync me mostra a seguinte msg: Error: Class AclExtraShell could not be loaded. O que poderia estar causando isso??

  • Beleza Bruno?

    O cake nao esta localizando os arquivos do plugin Acl_Extra. Verifique como você fez a instalação do mesmo.

    Abraços,

  • Bruno Marques

    Opa…
    Seguinte, na minha public_html tem lá testes/cake13 (cake13 por causa da versao 1.3)
    e na raiz do windows c:cakecakelib

    Será que é por causa disso??

  • Bruno, neste caso, onde e como você descompactou os arquivos do plugin Acl_Extra?

    O problema não esta no ambiente, e sim na instação do plugin Acl_Extra.
    Veja se descompactou corretamente, verificando a estrutura de pastas/arquivos.

    Valeu!

  • Bruno Marques

    OPa.. fiquei sem net… afff

    Após descompactar, ficou assim:

    testescontas13pluginsacl_extras e
    testescontas13pluginsacl_caching

  • Brunão, aparentemente esta correto.
    Tente utilizar a estruta convencional do Cake1.3, colocando os plugins dentro da pasta app/plugins.

    Por um motivo desconhecido o cake não esta encontrando os plugins instalados…

    Instalando os plugins tudo vai funcionar de primeira =D

    Valeu.

  • Bruno Marques

    É fi… de u nao… Error: Class AclExtrasShell could not be loaded.

    Tentei refazer aki e deu na mesma… qual a versao do cake q vc utilizou pra fazer esse plugin?
    Eu to utilizando a 1.3.13..

  • Bruno, o Acl_Extras é do meu amigo markstory.
    Tente baixar a versão mais recente no repositório dele. https://github.com/markstory/acl_extras

    O Acl_Caching é compativel com qualquer versão 1.3 do CakePHP.

    Abraços!

  • Cara, da uma olhada neste link do CookBook para ver se te ajuda a entender a estrutura de plugins e como ativa-los no seu Cake: http://book.cakephp.org/1.3/pt/view/1111/Plugins

  • Bill

    Estou com o mesmo problema do Bruno.
    Estou usando a última versão do CakePHP 1.3.14 e a versão mais recente tb do AclExtras. Notei no repositório do plugin q o Mark fez algumas alterações para funcionar com Cake 2.x. Será q não tem mais suporte para o Cake 1.3.x ?

  • Tem razão Bill.
    Esse é o link para baixar a versão compativel com o Cake 1.3: https://github.com/markstory/acl_extras/tree/1.3

    Atualizei os links do post tambem.

    Obrigado! =D

  • Lucimar Leandro

    Blz Pedro, tentei seguir o tutorial, mas ao tentar usar o comando 
    cake acl_extras aco_sync da a seguinte mensagem: 
    Error: Class AclExtrasShell could not be loaded. O plugin está em app/plugins/AclExtras, estou usando o cake 1.3.14. Alguma sugestão?

  • Lucimar, provavelmente você esta utilizando a versão para Cake 2 do Acl_Extras. Baixe a versão para Cake 1.3 neste link: https://github.com/markstory/acl_extras/tree/1.3

  • Lucimar Leandro

    Muito obrigado Pedro, era esse mesmo o problema. Ótimo tutorial, me ajudou bastante.

  • Wellington

    Olá, Fiz todos os passo mas não está funcionando no cakephp 2.0. Aparece a mensagem “Error: Plugin AclExtras could not be found.” quando executo ”
    cake acl_extras aco_sync “

  • Wellington, este plugin é compatível com o CakePHP 1.3

  • Neto Basilio

     Tente usar o comando “./Console/cake AclExtras.AclExtras aco_sync” dentro da pasta /app

    Referência com o plugin AclExtras para o CakePHP 2.0
    http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/part-two.html

    Lembrando, faça o comando dentro da pasta APP senão o CakePHP irá dar erro de caminho… o console mudou um pouco para esta nova versão.

  • Marciofornari

    Que belo Post, só uma dúvida.
    Eu to fazendo no cake 2.0, achei o plugin para o cake 2.0, deu tudo certo.
    no finalzinho na hora de adicionar os grupos está dando o seguinte erro:

    Notice (8): Indirect modification of overloaded property AclCachingComponent::$controller has no effect [APPPluginacl_cachingcontrollerscomponentsacl_caching.php, line 90]

    Fatal error: Cannot assign by reference to overloaded object in C:xampphtdocspmbookappPluginacl_cachingcontrollerscomponentsacl_caching.php on line 90

    sabe alguma coisa?

  • Marcio, ainda não desenvolvi a versão deste plugin para Cake 2.0 =((
    A licença dele é aberta e outra pessoa pode ter feito isso, visto que você encontrou uma versão para Cake 2.0
    Assim que eu finalizar a nova versão postarei aqui no site,
    Abraços.

  • Marciofornari

     Opa Pedro, muito obrigado pela atenção, consegui encontrar os dois plugins para cake 2.0
    Acl Extras => https://github.com/markstory/acl_extras
    Acl Caching => http://www.alaxos.ch/blaxos/pages/view/plugin_acl_2.0

    Porém ainda está dando erro, vou fazer uns testes, se der certo eu posto aki para ajudar a galera que venha a pesquisar também.

  • Thiago Brown

    Valeu Pedro, pelo tutorial!

    Mas queria saber se tem como fazer autentificação de usuário pertencente a vários grupos? Tipo assim: Em um sistema para universidade eu tivesse um usuário que fosse aluno e professor (grupo aluno e grupo professor).

  • Thiago,

    O ACL do Cake1.3 não permite que um usuário tenha mais de um Grupo associado. Entretando, você pode dar as mesmas permissões para ambos os grupos (aluno e professor) e em telas específicas filtrar o grupo do usuário antes de exibir. Não fica bonito mas é uma solução.

    Não sei como está o Cake2 com relação a isso, mas acho que vale a pena dar uma olhadinha.

    Abraços!

  • Pedro o que é necessario fazer para utilizar esse plugins na versão 2.0 do cake?

  • Pedro quais modificações necessárias usando cake 2.0?

  • Então… precisa revisar e alterar quase tudo (acredito). Muita coisa mudou no ACL para a versão 2.0

    Eu estou devendo essa atualização do plugin para muita gente, alias minha promessa já está quase fazendo aniversário rsrs

    Mas infelizmente ainda não tenho previsão para cumpri-la =(

    No momento estou aguardando uma ou mais almas caridosas que queriam compartilhar o projeto comigo no GitHub e continue tocando o plugin. Tem muito a ser feito ainda…

  • Pedro, tudo certo?
    Migrei para o CakePHP 2.3.7, tem atualização do plugin para esta versão?