As Policies no Laravel são uma forma poderosa de centralizar e organizar a lógica de autorização da sua aplicação. Ao invés de misturar regras de acesso nos controllers ou nas views, você pode isolá-las em classes específicas, tornando o código mais limpo, seguro e reutilizável.
Neste artigo, você vai aprender como criar, registrar e aplicar Policies no Laravel, com um passo a passo direto ao ponto, ideal tanto para quem está começando quanto para quem quer melhorar a organização do seu código.
🔐 O que são Policies no Laravel?
As Policies funcionam como “gatekeepers” — elas determinam se um usuário pode executar uma determinada ação em um determinado recurso (geralmente um Model, como um Post, Produto, ou Usuário).
✅ Gate vs Policy
- Gate: usado para ações genéricas, que não estão relacionadas diretamente a um Model.
- Policy: usada quando você precisa autorizar ações sobre instâncias de um Model (ex: se o usuário pode editar um Post específico).
🛠️ Como criar uma Policy no Laravel
1. Gerar a Policy com o Artisan
php artisan make:policy PostPolicy --model=Post
Este comando cria uma Policy já ligada ao Model Post. O arquivo será gerado em app/Policies/PostPolicy.php.
2. Entendendo a estrutura gerada
Exemplo de método gerado:
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
Esse método verifica se o usuário é o dono do post antes de permitir a edição.
🔗 Registrando a Policy
A Policy pode ser registrada automaticamente se seguir a convenção de nome (Post → PostPolicy). Mas para garantir, edite o arquivo AuthServiceProvider.php:
protected $policies = [
App\Models\Post::class => App\Policies\PostPolicy::class,
];
Não esqueça de importar as classes corretamente no topo do arquivo.
🔎 Como usar a Policy na prática
1. Em Controllers
Use o método $this->authorize():
public function update(Request $request, Post $post)
{
$this->authorize('update', $post);
// código de atualização aqui
}
Se a autorização falhar, ele lança automaticamente uma exceção 403.
2. Nas Views Blade
@can('update', $post)
<a href="{{ route('posts.edit', $post) }}">Editar</a>
@endcan
3. Em FormRequests
public function authorize()
{
return $this->user()->can('update', $this->route('post'));
}
✅ Boas práticas com Policies
- Crie Policies separadas por Model.
- Mantenha apenas lógica de autorização nelas, nada de regras de negócio.
- Use nomes de métodos como view, update, delete, create, seguindo a convenção do Laravel.
- Sempre proteja ações críticas com authorize().
Agora que você viu como usar Policies no Laravel, que tal aplicar isso no seu projeto e organizar de vez sua lógica de autorização? Tem dúvidas ou sugestões? Comenta aqui embaixo ou compartilha com a galera do seu time!
Pingback: Estrutura de Pastas Laravel: Guia para Desenvolvedores -