Em qualquer sistema que você for desenvolver em CakePHP, utilizar ACL é imprescindível. Com ele podemos implementar um controle de permissões de acesso através de grupos/usuário aos Controllers/Actions de nosso aplicação. Se você está utilizando-o, eu tenho uma ótima dica para você. =]

Problema

Em aplicações simples, você tem em torno de 10 usuários e 5 grupos. Até aqui tudo funciona normalmente. Agora, vamos imaginar um número muito maior de usuários para aproximadamente 10.000 mil…

Obviamente este número não é realidade para a maioria (99,9%) das aplicações. Mas, por experiência própria, a partir de 100 usuário você já tem problema de performance com as pesquisas nas tabelas ACO/ARO.

Um exemplo de queries lentas:

5502 ms

628 ms

Uma Solução…

Encontrei uma solução elaborada por Jon Bennet – disponibilizada no cakegroup – que melhorou a performance da aplicação em 300%. Inacreditável!

A solução é simples, basta você criar os seguintes índices em seu banco de dados:

A Melhor Solução

Para melhorar ainda mais a performance, você pode utilizar um plugin que desenvolvi especialmente para fazer cache de todas as definições de permissões no momento do login, o ACL_Caching, eliminando as “trocentas” consultas realizadas pelo ACL a cada action requisitada.

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.

Se você deseja começar uma aplicação já com o ACL_Caching, veja este tutorial: Controle de acesso a nível grupo/usuário no CakePHP 1.3 + ACL + Caching

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>5 de agosto 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/08/problema-de-performance-com-cakephp-acl/" title="Melhorando a performance do ACL no CakePHP 1.3">Melhorando a performance do ACL no CakePHP 1.3</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.
  • Lucas Gameiro

    Pedro,

    muito interessante seu plugin para cachear as consultas da acl porém, acredito que se utilizar o Aro realizando a busca de permissão por grupo e não para todo usuário seja uma solução bem eficiente e muito mais simples.

    A árvore ficará bem pequena e acredito que não chegue a demorar nem 1ms para montá-la se ficarmos com ela  dessa maneira

    +—-+———–+——-+————-+——-+——+——+
    | id | parent_id | model | foreign_key | alias | lft | rght |
    +—-+———–+——-+————-+——-+——+——+
    | 1 | NULL | Group | 1 | NULL | 1 | 2 |
    | 2 | NULL | Group | 2 | NULL | 3 | 4 |
    | 3 | NULL | Group | 3 | NULL | 5 | 6 |
    +—-+———–+——-+————-+——-+——+——+

    Esse link descreve como fazer isso:
    http://book.cakephp.org/1.3/en/view/1547/Acts-As-a-Requester

  • Legal Lucas, desconhecia essa configuração para o ACL.

    Contudo, ela descaracteriza o melhor benefício do ACL que é o sistema de permissão em árvore… A flexibilidade de definir permissões para o grupo ou/e usuários, é um beneficio que potencializa o AclCaching.

  • William Castro

    Amigo você é um monstro, rsrs no bom sentido!!! Muito show cara, parabéns…

  • Hehehe Valeu! =D