Políticas: autorização baseada em modelos
Associe políticas a modelos Eloquent e use-as nos controladores.
Políticas: autorização baseada em modelos é uma aula grátis de PHP Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de PHP Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de PHP Academy inclui 4 aulas no total.
O que é uma política?
Uma política é uma classe que organiza a lógica de autorização para um modelo Eloquent específico. As políticas são recomendadas quando há várias ações de autorização para o mesmo modelo.
Gerando uma política
Use o Artisan para gerar uma política. Adicione --model para preencher previamente os métodos padrão.
$ php artisan make:policy PostPolicy --model=PostMétodos de política
Cada método corresponde a uma ação. Ele recebe o usuário autenticado e a instância do modelo.
<?php
class PostPolicy
{
public function view(?User $user, Post $post): bool
{
return $post->is_published || $user?->id === $post->user_id;
}
public function update(User $user, Post $post): bool
{
return $user->id === $post->user_id;
}
public function delete(User $user, Post $post): bool
{
return $user->id === $post->user_id || $user->isAdmin();
}
}Registrando políticas
No Laravel 11+, as políticas são descobertas automaticamente se seguirem as convenções de nomenclatura (modelo Post → PostPolicy). Também é possível registrá-las manualmente no AuthServiceProvider.
Usando políticas em controladores
Chame $this->authorize("action", $model) — o Laravel encontra automaticamente a política correspondente.
<?php
public function update(Request $request, Post $post): RedirectResponse
{
$this->authorize("update", $post);
$post->update($request->validated());
return redirect()->route("posts.show", $post);
}Política no Blade
A diretiva @can funciona com políticas da mesma forma que com Gates.
@can('update', $post)
<a href="/posts/{{ $post->id }}/edit">Edit</a>
@endcanMétodo before()
O método opcional before() de uma política é executado antes dos outros métodos. Retorne true para conceder acesso irrestrito (por exemplo, a administradores).
<?php
public function before(User $user, string $ability): ?bool
{
if ($user->isAdmin()) return true;
return null; // continue to specific method
}Ação de criação (sem instância do modelo)
O método de política create recebe apenas o usuário (não um modelo), pois ainda não existe uma instância.
<?php
public function create(User $user): bool
{
return $user->hasVerifiedEmail();
}Verificando políticas manualmente
Use a fachada Gate ou o modelo de usuário para verificar políticas diretamente.
<?php
Gate::allows("update", $post); // true/false
$user->can("update", $post); // true/false
$user->cannot("delete", $post); // true/falseRespostas de políticas
Retorne um objeto Response de um método de política para personalizar a mensagem de negação.
<?php
use Illuminate\Auth\Access\Response;
public function publish(User $user, Post $post): Response
{
return $user->isEditor()
? Response::allow()
: Response::deny("Only editors can publish posts.");
}Testando políticas
Teste as políticas assumindo a identidade de um usuário específico no PHPUnit.
<?php
public function test_owner_can_delete_post(): void
{
$user = User::factory()->create();
$post = Post::factory()->create(["user_id" => $user->id]);
$this->assertTrue($user->can("delete", $post));
}Resumo
As políticas agrupam a autorização no nível do modelo. Gere-as com make:policy --model. Use $this->authorize() nos controladores e @can no Blade. Use before() para permitir que administradores ignorem as verificações.
Verificação rápida
Qual método de política recebe apenas o usuário, sem uma instância do modelo?
Perguntas Frequentes
A aula “Políticas: autorização baseada em modelos” é grátis?
Sim — o texto completo de “Políticas: autorização baseada em modelos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de PHP Academy, atualize para CoddyKit PRO. O curso de PHP Academy inclui 4 aulas no total.
O que vou aprender em “Políticas: autorização baseada em modelos”?
Associe políticas a modelos Eloquent e use-as nos controladores. Você pratica PHP Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar PHP Academy?
Nenhuma experiência prévia é necessária. PHP Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Políticas: autorização baseada em modelos”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de PHP Academy?
Sim. Cada aula de PHP Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Autenticação com Laravel Breeze
- Proteção de rotas com middleware
- Gates: verificações simples de autorização
- Políticas: autorização baseada em modelos