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étodo | Funçã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:
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:















