Como dividir funções em um projeto Laravel: uma visão geral dos pacotes RBAC

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-permission
Documentação: https://docs.spatie.be/laravel-permission/v3
Nú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
  1. Disponibilidade de comandos artesanais para criar / atribuir direitos.
  2. Escopo concluído por funções e direitos.
  3. A capacidade de verificar os direitos do usuário usando ferramentas padrão devido ao fato de o pacote usar o Laravel Auth Gates.
  4. Capacidade de usar as diretivas blade do pacote: role (@hasrole), @hasanyrole, @hasallroles, @unlessrole.
  5. 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

//    $user->givePermissionTo('edit articles'); //    $user->assignRole('writer', 'admin'); //       $user->assignRole(['writer', 'admin']); //    $role->givePermissionTo('edit articles'); 


Bouncer por joseph silber


Link: https://github.com/JosephSilber/bouncer
Documentação: https://github.com/JosephSilber/bouncer#introduction
Nú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
  1. Capacidade de usar sem o Laravel.
  2. Sincronização de direitos e funções.
  3. A capacidade de impor restrições aos direitos (para uma classe específica de modelo ou para uma instância específica.
  4. 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".
  5. Suporte à multilocação (com base na função de escopo).
  6. 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.
  7. Comando do artesão do console para limpar o banco de dados da permissão não utilizada.
  8. 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ódigo

Restriçã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/laratrust
Documentaçã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
  1. Este é um fork do ENTRUST ( https://github.com/Zizaco/entrust ).
  2. Existem diretivas blade.
  3. 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 .
  4. Sincronização de papéis / direitos.
  5. Capacidade de disponibilidade - verificação simultânea de funções e direitos.
  6. Middleware pronto.
  7. 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) //   $post->user_id   $owner = new Role(); $owner->name = 'owner'; $owner->display_name = 'Project Owner'; // optional $owner->description = 'User is the owner of a given project'; // optional $owner->save(); 


Sentinel by Cartalyst


Link: https://github.com/cartalyst/sentinel
Documentação: https://cartalyst.com/manual/sentinel/3.x
Nú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
  1. Inclui não apenas funções e direitos, mas também tudo relacionado ao registro.
  2. 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.
  3. Usando o complemento Permissões de Expiração do Sentinel, você pode emitir direitos de tempo.
  4. 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

 //   $user = Sentinel::findById(1); $role = Sentinel::findRoleByName('Subscribers'); $role->users()->attach($user); //   $admin = Sentinel::inRole('admin'); //   $user->permissions = [ 'user.create' => true, 'user.delete' => false, ]; $user->save(); //   $user->hasAccess(['user.create', 'user.update']); Sentinel::hasAnyAccess(['user.admin', 'user.update']); 


Laravel-ACL por Kodeine


Link: https://github.com/kodeine/laravel-acl
Documentação: https://github.com/kodeine/laravel-acl/wiki
Nú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
  1. Sincronização de papéis e direitos.
  2. Direitos de herança.
  3. Tendo suas diretivas blade: função , permissão .
  4. 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
 //   $permissionInternship = Permission::create([ 'name' => 'internships', 'slug' => [ //   'create' => true, 'view' => true, 'update' => true, 'delete' => true, ], 'description' => 'manage internships' ]); $permissionStudent = Permission::create([ 'name' => 'internships.student', 'slug' => [ //     'create' => false, ], //   'inherit_id' => $permissionInternship->getKey(), 'description' => 'student internship permissions' ]); 


Laravel-acl por Mateus Junges


Link: https://github.com/mateusjunges/laravel-acl
Documentaçã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
  1. Escopo finalizado.
  2. Sincronização de direitos para grupos.
  3. Tendo as diretivas blade: group , @elsegroup, permissão , @elsepermission, @ allpermission, @ allgroups, @anypermission, @anygroup
  4. A presença de comandos internos para o artesão criar grupos / direitos e exibi-los, bem como exibir direitos do usuário.
  5. Disponibilidade de middleware pronto: PermissionMiddleware, GroupMiddleware, HierarchicalPermissions, PermissionOrGroupMiddleware.
  6. 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


Source: https://habr.com/ru/post/pt481796/


All Articles