0Pricing
PHP Academy · Aula

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=Post

Mé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>
@endcan

Mé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/false

Respostas 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

  1. Autenticação com Laravel Breeze
  2. Proteção de rotas com middleware
  3. Gates: verificações simples de autorização
  4. Políticas: autorização baseada em modelos
← Voltar para PHP Academy