Ao desenvolver um projeto da Web no qual existem contas de usuário, surge frequentemente a questão de organizar um sistema de funções e direitos para delimitar o acesso a determinadas seções e funções do sistema. Neste artigo, comparamos os pacotes de controle de acesso e resumimos a tabela.

1. Introdução
Na versão 5.1, o Laravel apresentou o Auth Gates, uma função de estrutura integrada para controle de acesso. Até esse momento, eu tinha que usar vários pacotes de terceiros. No entanto, mesmo agora, o programador tem uma escolha: escreva tudo você mesmo ou use algum pacote pronto. A primeira opção é adequada para pequenos projetos ou projetos com um sistema simples de direitos e funções. O segundo (com a escolha certa do pacote) permite um ajuste mais preciso.
O objetivo deste artigo é revisar os pacotes existentes que implementam o RBAC (Controle de Acesso Baseado em Função) - controle de acesso baseado em função. Esclareceremos imediatamente que este artigo não pretende ser a verdade última: cada desenvolvedor deve determinar qual pacote ele precisa (se houver). Nota: neste artigo, estamos considerando o RBAC, portanto, na revisão do Sentinel, lidamos apenas com essa parte das funções disponíveis.
Descrição do pacote
Permissão do Laravel por Spatie
Link: https://github.com/spatie/laravel-permissionDocumentação: https://docs.spatie.be/laravel-permission/v3Número de downloads (no momento da redação): 3,6M
Versão Laravel: da versão 5.8 para a versão 3
A presença da interface: no (você pode usar o
pacote )
Baseado no Laravel Auth: sim
Funcionalidades- Disponibilidade de comandos artesanais para criar / atribuir direitos.
- Escopo concluído por funções e direitos.
- A capacidade de verificar os direitos do usuário usando ferramentas padrão devido ao fato de o pacote usar o Laravel Auth Gates.
- Capacidade de usar as diretivas blade do pacote: role (@hasrole), @hasanyrole, @hasallroles, @unlessrole.
- Sincronização de direitos e funções.
Nota: quando authorize () for chamado para política, se a permissão tiver o mesmo nome que política, funcionará, não política.
Estrutura de banco de dados
Exemplos de código
Bouncer por joseph silber
Link: https://github.com/JosephSilber/bouncerDocumentação: https://github.com/JosephSilber/bouncer#introductionNúmero de downloads (no momento da redação): 418K
Versão Laravel: de 5.1.20
A presença da interface: no (você pode usar o
pacote )
Baseado no Laravel Auth: sim
Funcionalidades- Capacidade de usar sem o Laravel.
- Sincronização de direitos e funções.
- A capacidade de impor restrições aos direitos (para uma classe específica de modelo ou para uma instância específica.
- Emissão de todos os direitos para entidades "suas": usando a função "toOwn", você pode emitir todos os direitos para uma entidade que pertence ao usuário (a comparação dos campos user_id e $ user-> id pode ser personalizada). Você pode limitar os direitos concedidos usando a função "para".
- Suporte à multilocação (com base na função de escopo).
- A capacidade de usar a função "escopo" para separar funções e direitos, dependendo das condições estabelecidas (com base em um identificador exclusivo) - por exemplo, direitos no painel de administração e na parte pública do site.
- Comando do artesão do console para limpar o banco de dados da permissão não utilizada.
- A capacidade de banir rapidamente um usuário ou remover uma proibição (habilidade proibida).
Nota: você pode criar uma função e direitos para ela com apenas uma linha.
Estrutura de banco de dados
Exemplos de códigoRestrição do direito por classe ou instância de modelo: Bouncer::allow($user)->to('edit', Post::class); Bouncer::allow($user)->to('edit', $post);
Emissão de direitos para "suas" entidades: Bouncer::allow($user)->toOwn(Post::class)->to(['view', 'update']);
Laratrust por santigarcor
Link: https://github.com/santigarcor/laratrustDocumentação: https://laratrust.santigarcor.me/Número de downloads (no momento da redação): 601K
Versão Laravel: ~ 6.0
Disponibilidade da interface: não
Baseado no Laravel Auth: não
Funcionalidades- Este é um fork do ENTRUST ( https://github.com/Zizaco/entrust ).
- Existem diretivas blade.
- Devido à substituição dos comandos padrão do Laravel pelos seus, é impossível trabalhar com a diretiva blade can - você precisará usar $ user-> can ('edit-user') ou a diretiva de permissão .
- Sincronização de papéis / direitos.
- Capacidade de disponibilidade - verificação simultânea de funções e direitos.
- Middleware pronto.
- Multitenancy baseado em equipes.
Estrutura de banco de dados
Exemplos de código $user->hasRole(['owner', 'admin']); $user->can(['edit-user', 'create-post']); $user->hasRole('owner|admin'); $user->can('edit-user|create-post'); $user->owns($post)
Sentinel by Cartalyst
Link: https://github.com/cartalyst/sentinelDocumentação: https://cartalyst.com/manual/sentinel/3.xNúmero de downloads (no momento da escrita): 957K
Versão Laravel: 6.2
Disponibilidade da interface: não
Baseado no Laravel Auth: não
Funcionalidades- Inclui não apenas funções e direitos, mas também tudo relacionado ao registro.
- O pacote é uma estrutura independente, ou seja, Ele pode ser usado não apenas no Laravel - você só precisa instalar as seguintes dependências usando o compositor: iluminar / banco de dados, iluminar / eventos, symfony / http-foundation.
- Usando o complemento Permissões de Expiração do Sentinel, você pode emitir direitos de tempo.
- Suporta Multitenancy com o complemento Sentinel Multitenancy.
Nota: ao instalar no Laravel 6.2 e PostgreSQL puro, um erro aparece durante a migração: a tabela de usuários já existe. Nesse caso, você deve alterar a migração padrão:
Estrutura de banco de dados
Exemplos de código
Laravel-ACL por Kodeine
Link: https://github.com/kodeine/laravel-aclDocumentação: https://github.com/kodeine/laravel-acl/wikiNúmero de downloads (no momento da redação): 170K
Versão Laravel: 5.0 e superior
Disponibilidade da interface: não
Baseado no Laravel Auth: não
Funcionalidades- Sincronização de papéis e direitos.
- Direitos de herança.
- Tendo suas diretivas blade: função , permissão .
- Disponibilidade do middleware finalizado.
Nota Alguns problemas e soluções durante a migração:
- No arquivo config / acl, você precisa adicionar a opção users_table com o nome da tabela de usuários para garantir uma migração estável.
- Você precisa instalar o pacote “doutrina / dbal” no Laravel puro para “fazer amizade” com migrações padrão, caso contrário, poderá ocorrer um erro ao atualizar os campos.
Estrutura de banco de dados
Exemplos de código
Laravel-acl por Mateus Junges
Link: https://github.com/mateusjunges/laravel-aclDocumentação: https://mateusjunges.imtqy.com/laravel-acl/Número de downloads (no momento da redação): 1,8K
Versão Laravel: 5.0 e superior
Disponibilidade da interface: sim (formulários prontos)
Baseado no Laravel Auth: não
Funcionalidades- Escopo finalizado.
- Sincronização de direitos para grupos.
- Tendo as diretivas blade: group , @elsegroup, permissão , @elsepermission, @ allpermission, @ allgroups, @anypermission, @anygroup
- A presença de comandos internos para o artesão criar grupos / direitos e exibi-los, bem como exibir direitos do usuário.
- Disponibilidade de middleware pronto: PermissionMiddleware, GroupMiddleware, HierarchicalPermissions, PermissionOrGroupMiddleware.
- Disponibilidade de formulários predefinidos para gerenciamento de funções.
Estrutura de banco de dados
Tabela Resumo

Conclusão
Cada um desses pacotes possui seu próprio campo de aplicação, portanto, é impossível escolher um único vencedor. De acordo com nossas estimativas, a permissão do Laravel e o Bouncer são mais adequados para um sistema de funções complexo, mas, ao mesmo tempo, existe uma Laravel-ACL da Kodeine com uma hierarquia de funções. O Laravel-ACL de Mateus Junges é uma opção "nova" e tem funcionalidade suficiente para criar um conjunto moderado de funções. O Sentinel é uma solução universal com vários recursos, além do gerenciamento de funções. Laratrust é para quem gosta de Entrust.
Além disso, não se pode deixar de mencionar as ferramentas padrão do Laravel - Gates and Policies. Eles facilitam a diferenciação do acesso a recursos em aplicativos que não exigem configurações complexas de direitos. Se o aplicativo tiver apenas algumas funções ou uma hierarquia não for necessária, suas necessidades poderão ser encerradas com Gates e Políticas.
Links úteis