Laravel – Políticas de Acesso e Permissões

O Laravel possui um ótimo sistema de controle políticas de acesso e permissões. Existem diferentes maneiras de implementa-las, pode ser usando a facade do Gate, ou criando Policies, o método de policies que será apresentado aqui, toda documentação pode ser conferida nesse link.

Vamos imaginar que você possui um model Task e um controller para adicionar, editar e e deletar tasks, vamos criar uma policy para controlar as permissões de acesso do usuário no update da task.

Criando a Policy de Task

Vamos criar essa policy já com um boilerplate:

php artisan make:policy TaskPolicy

Ele já cria um arquivo com os métodos preparados para controle das permissões, vamos agora registrar essa policy no AuthServiceProvider.php:

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        Task::class => TaskPolicy::class,
    ];

Com a policy registrada, vamos criar nossas regras de acesso, usando como exemplo o método de update:

class TaskPolicy
{
    /*
     * Verificamos se o usuário é dono
     * da task que vai ser atualizada
     */
    public function update(User $user, Task $task)
    {
        return $user->id === $task->user_id;
    }

Com nossa política de acesso configurada, onde o usuário terá permissão caso seja o dono da task, vamos implementa-la no nosso controller:

class TaskController extends Controller 
{

/*
* Se o usuário não tem permissão, retorne um status 403
*/
public function update(Task $task) 
{
    if(!$this->authorize('update', $task)) {
        return response([], 403);
    }
}

Agora podemos também bloquear o botão de editar no nosso template usando o blade, de forma muito simples:

@can('update', $task)
<button>editar</button>
@endcan

No exemplo acima o botão de editar será exibido apenas se o usuário logado tiver  a permissão.

Sempre que usamos um método de autorização do laravel ele procura as políticas registradas no AuthServiceProvider e aplica de acordo com o seu tipo.

Se temos um usuário administrador e queremos dar um acesso geral, podemos usar o método before no TaskPolicy ou na AuthServiceProvider:

class TaskPolicy
{
    public function before(User $user) 
    {
         if($user->type == 'administrator') {
              return true;
         }
    }

 

Ele deve executar o before antes de tudo e já retornar a autorização de acesso.

Exemplo no AuthServiceProvider, aplicamos o before da facade Gate dentro do método boot:

class AuthServiceProvider extends ServiceProvider 
{
    ...
    public function boot(User $user) 
    {
         $this->registerPolicies();
         Gate::before(function(User $user) {
              if($user->type == 'administrator') {
                  return true; 
              }
         });
    }

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *