Laravel Authorization

Laravel
Tempo de leitura: 3 minutos

Laravel Authorization: A autorização é um componente fundamental em qualquer aplicação web, garantindo que apenas usuários autorizados possam acessar recursos específicos. O Laravel oferece mecanismos robustos e flexíveis para implementar a autorização, como Gates e Policies.

Neste artigo, vamos explorar esses conceitos em profundidade, com um exemplo prático de como controlar o acesso a posts em um blog.

Gates: Uma Abordagem Simples

Gates são ideais para regras de autorização simples e globais. Vamos criar um gate para verificar se um usuário pode excluir um post:

PHP

use Illuminate\Support\Facades\Gate;

Gate::define('delete-post', function ($user, $post) {
    return $user->id === $post->user_id;
});

Este gate verifica se o ID do usuário logado é igual ao ID do usuário que criou o post.

  • Utilizando o Gate:

PHP

if (Gate::allows('delete-post', $post)) {
    // O usuário pode excluir o post
    $post->delete();
} else {
    // O usuário não tem permissão
    abort(403, 'Você não tem permissão para excluir este post.');
}

Policies: Encapsulando a Lógica de Autorização

Policies são classes que encapsulam a lógica de autorização para um modelo específico. Elas são ideais para regras de autorização mais complexas.

  • Criando uma Policy:

Bash

php artisan make:policy PostPolicy
  • Implementando a Policy:

PHP

namespace App\Policies;

use App\Models\Post;
use App\Models\User;

class PostPolicy
{
    public function update(User $user, Post $post)
    {
        return $user->id === $post->user_id || $user->isAdmin();
    }

    public function delete(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}
  • Registrando a Policy:

PHP

protected $policies = [
    Post::class => PostPolicy::class,
];
  • Utilizando a Policy:

PHP

if ($this->authorize('update', $post)) {
    // O usuário pode atualizar o post
}

Exemplo Completo: Um Blog com Autorização

  • Modelo de Usuário:

PHP

class User extends Authenticatable
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }

    public function isAdmin()
    {
        return $this->role === 'admin';
    }
}
  • Modelo de Post:

PHP

class Post extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
  • Controlador de Posts:

PHP

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function destroy(Post $post)
    {
        $this->authorize('delete', $post);

        $post->delete();

        return redirect()->route('posts.index');
    }
}
  • Rota:

PHP

Route::delete('/posts/{post}', [PostController::class, 'destroy'])->name('posts.destroy');
  • Visão (blade):

HTML

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

Neste exemplo:

  • Gates: Utilizamos um gate para verificar se um usuário pode excluir um post.
  • Policies: Criamos uma Policy para o modelo Post, permitindo que um usuário atualize seu próprio post ou que administradores atualizem qualquer post.
  • Autorização em rotas: Utilizamos o método authorize para verificar a autorização antes de excluir um post.
  • Visões: Utilizamos a diretiva @can para mostrar ou esconder o botão de exclusão com base na autorização.

Conclusão

Laravel Authorization: O Laravel oferece ferramentas poderosas para implementar a autorização em suas aplicações. Ao utilizar Gates e Policies, você pode criar regras de autorização personalizadas e garantir que seus usuários tenham acesso apenas aos recursos que lhes são permitidos.

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