Laravel Authorization

Laravel
Tempo de leitura: 4 minutos

Laravel Authorization: A Autorização no Laravel é o processo de determinar se um usuário autenticado tem permissão para realizar uma determinada ação em um recurso. O framework oferece dois mecanismos principais para gerenciar essa lógica: Gates (Portões) e Policies (Políticas). Juntas, essas ferramentas fornecem um sistema de controle de acesso robusto, flexível e organizado.

1. 🚪 Gates (Portões): Regras Simples e Globais

Gates são Closures simples, definidos no AuthServiceProvider, ideais para regras de autorização que não estão estritamente ligadas a um único modelo ou para regras globais.

A. Definição do Gate

Um Gate recebe a instância do usuário autenticado e, opcionalmente, o modelo sobre o qual a ação será realizada. Ele deve retornar true ou false.

PHP

// app/Providers/AuthServiceProvider.php -> boot()

use Illuminate\Support\Facades\Gate;
use App\Models\Post;

// Define a regra 'delete-post'
Gate::define('delete-post', function ($user, Post $post) {
    // Retorna TRUE se o usuário for o criador do post
    return $user->id === $post->user_id;
});

B. Verificando o Gate

Você pode verificar a permissão usando os métodos estáticos da Facade Gate:

MétodoFunção
Gate::allows('ação', [recurso])Retorna true se o usuário tiver permissão.
Gate::denies('ação', [recurso])Retorna true se o usuário não tiver permissão.
@can('ação', $recurso)Diretiva Blade para verificação no frontend.

PHP

use Illuminate\Support\Facades\Gate;

// Exemplo em um Controller
if (Gate::denies('delete-post', $post)) {
    // Lança exceção 403 (Forbidden)
    abort(403, 'Acesso não autorizado.'); 
}

$post->delete();

2. 📜 Policies (Políticas): Lógica por Modelo

Policies são classes dedicadas a encapsular toda a lógica de autorização para um modelo Eloquent específico. Elas são a forma preferida para regras de autorização mais complexas e orientadas a objetos.

A. Criação e Estrutura

Gere uma Policy para o modelo Post:

Bash

php artisan make:policy PostPolicy --model=Post

A classe PostPolicy conterá métodos que correspondem às ações do modelo (view, create, update, delete, etc.).

PHP

// app/Policies/PostPolicy.php

class PostPolicy
{
    /**
     * Determina se o usuário pode atualizar o post.
     */
    public function update(User $user, Post $post)
    {
        // O usuário pode atualizar se for o criador OU se for um administrador
        return $user->id === $post->user_id || $user->isAdmin();
    }

    /**
     * Determina se o usuário pode excluir o post.
     */
    public function delete(User $user, Post $post)
    {
        return $user->id === $post->user_id; // Apenas o criador
    }
}

B. Registro da Policy

Para que o Laravel saiba qual Policy usar para qual modelo, você deve registrá-la no array $policies do AuthServiceProvider.php.

PHP

// app/Providers/AuthServiceProvider.php

protected $policies = [
    \App\Models\Post::class => \App\Policies\PostPolicy::class,
    // [Modelo::class] => [Policy::class],
];

C. Utilizando a Policy (Controller)

O método $this->authorize() (disponível em Controllers que estendem a classe base) verifica a Policy e lança uma exceção 403 automaticamente se a permissão for negada.

PHP

// No PostController::update(Request $request, Post $post)

// O Laravel automaticamente localiza e chama PostPolicy@update(User $user, Post $post)
$this->authorize('update', $post); 

// O código abaixo só é executado se a Policy retornar TRUE
$post->update($request->validated());

3. 🌐 Autorização em Rotas e Views

A. Autorização em Rotas

Você pode usar o Middleware can para verificar Gates ou Policies antes mesmo que o Controller seja chamado.

PHP

// O middleware can usa a Policy implícita (modelo Post, ação update)
Route::put('/posts/{post}', [PostController::class, 'update'])
    ->middleware('can:update,post'); 

B. Autorização no Frontend (Blade)

A diretiva @can é a forma mais limpa de exibir ou ocultar elementos da UI.

HTML

@can('delete', $post) 
    <form action="{{ route('posts.destroy', $post) }}" method="POST">
        @csrf
        @method('DELETE')
        <button type="submit" class="btn btn-danger">Excluir Post</button>
    </form>
@endcan

@cannot('delete', $post)
    <span class="text-muted">Você não pode excluir este post.</span>
@endcannot

4. 🎛️ Regra do Super-Usuário (before)

O Laravel permite que você defina uma regra super-user que é executada antes de qualquer método da Policy. Se retornar true, a autorização é concedida imediatamente.

PHP

// app/Policies/PostPolicy.php

public function before(User $user, string $ability)
{
    // Se o usuário for um super-admin, ele pode fazer TUDO
    if ($user->isSuperAdmin()) {
        return true;
    }
    // Caso contrário, a verificação continua nos outros métodos
    return null; 
}

✅ Conclusão Laravel Authorization

Laravel Authorization: O sistema de autorização, com Gates para regras simples e Policies para a lógica por modelo, é essencial para proteger recursos. Ao utilizar $this->authorize() nos Controllers e @can nas Views, você garante que apenas usuários com a permissão correta possam interagir com partes específicas da sua aplicação, tornando-a segura e confiável.

Mas antes de dominar o Laravel, se for o seu caso, toda jornada tem um início. Vamos entender quais são os conhecimentos básicos necessários para aproveitar ao máximo este poderoso framework. Para iniciar seus estudos no Laravel, você precisará dominar as seguintes tecnologias:

HTML
HTML
CSS
CSS
Javascript
JavaScript
SQL
SQL
Capa Curso PHP
PHP

E se você gosta do nosso conteúdo, não deixe de contribuir adquirindo os serviços e produtos dos nossos apoiadores e empresas que somos associados:

Hospedagem Hostinger
Ofertas Amazon
Amazon Prime
Author: Thiago Rossi
Com mais de 20 anos de jornada na tecnologia, minha trajetória evoluiu do ensino técnico à arquitetura de sistemas complexos. Hoje, foco minha expertise no desenvolvimento de soluções de Inteligência Artificial nativa e análise de dados públicos, utilizando o ecossistema PHP para transformar dados brutos em transparência e eficiência. Como autor e desenvolvedor, acredito na democratização do conhecimento. Essa visão resultou em uma biblioteca de mais de 530 artigos gratuitos, cobrindo desde a base do WebDev e Infraestrutura até os bastidores da indústria de Jogos e IA. No universo de Game Design, sou autor do livro "GDD – O Guia Definitivo" e documento ativamente meus processos através de DevLogs, unindo rigor técnico e criatividade em projetos desenvolvidos com GDevelop 5. Meu compromisso é conectar engenharia de ponta com as reais oportunidades do mercado de tecnologia.