Q:

Permissões de acesso no Laravel 4

Estou desenvolvendo um sistema no Laravel 4 com base em tutoriais e documentação oficial do Laravel. Não tenho visto algo relacionado a permissões de acesso (ACL) no Laravel. Sabendo que meu sistema terá vários recursos disponíveis, como: Notícias, Produtos, Administração de Usuários, entre outros, como eu poderia fazer de forma prática uma página onde eu insira as permissões por módulo que cada usuário terá acesso?
Penso em algo onde eu cadastre níveis de permissões (Admin, User, Editor) e depois, no cadastro do usuário, eu vinculo algum nível. Por outro lado, na hora de cadastrar um usuário eu poderia ter opções de checkbox com os tipos de permissões (editar, visualizar, excluir) de cada módulo específico, e selecionaria o desejado para cada usuário. Neste caso, eu optaria em dar permissões individuais por usuário ou selecionaria um nível específico para aquele usuário.
Alguém tem alguma base que eu poderia seguir para desenvolver este recurso?

A:

Você pode experimentar o Sentry 2 - uma solução robusta para autenticação, autorização e ACL. Essa biblioteca começou como um bundle do Laravel, mas evoluiu para um pacote que pode ser instalado em outros frameworks. Segue o link específico para integração com Laravel 4: 
https://cartalyst.com/manual/sentry/installation/laravel-4
E segue o link para a documentação sobre permissões:
https://cartalyst.com/manual/sentry/permissions

Se você preferir construir a sua própria solução, ao invés de usar uma solução pronta, minha sugestão é usar três tabelas:

A sua tabela de usuários.
Uma tabela de ações.
Uma tabela de conexão many-to-many ligando as duas ("usuarios_acoes")

Você também pode considerar:

Uma tabela de níveis.
Uma tabela de conexão many-to-many ligando os níveis com as acções ("niveis_acoes")

Nesse caso, você pode ou eliminar a tabela "usuarios_acoes" e guardar apenas um "id_nivel" na tabela "usuarios", aplicando exclusivamente as permissões do nível... ou então manter a tabela "usuarios_acoes" e aplicar um nível a um usuário - o que copiaria as ações do "nível" para o "usuário", mas ainda assim permitindo um ajuste fino individual. Essa seria a versão mais robusta.
Você terá o trabalho de definir as ações da tabela "ações", e de definir quais ações cada "nível" pode executar e/ou quais ações cada usuário pode executar.

Além da estrutura e armazenamento no banco de dados, você vai precisar de algum filtro ou outro mecanismo que verifique se o usuário tem permissão ou não de executar determinada ação.
E, num grau mais "fino" ainda, você poderá querer que a própria interface apresente ou não elementos de interação, baseado nas permissões.
Eu já montei um CMS com tudo isso que estou descrevendo acima - cada usuário vê apenas as opções no menu e os botões das ações que têm permissão. Ficou bem bacana. Com certeza, no back-end o sistema verifica as permissões - pois se a diferença ficasse apenas na interface, um usuário teria a possibilidade de ser bem sucedido ao forjar uma requisição HTTP de uma ação que ele não tem permissão para realizar.
Eu fui além: um usuário que tem a permissão de dar/remover permissões dos outros usuários pode apenas "delegar" aquelas ações das quais ele mesmo tem permissão para executar. Na interface, feita em ExtJS, aparece um "checkbox-tree", onde é possível marcar/desmarcar todo um grupo de ações de uma vez, ou cada uma individualmente...
Ficam aí as dicas e comentários. 

