Article image
Thiago Rossi
Thiago Rossi16/12/2024 10:04
Compartilhe

Você pode, você não pode: Permissões com 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.


    ESTE É UM DOS 37 ARTIGOS QUE COMPÕE UMA SÉRIE DE ARTIGOS SOBRE LARAVEL. ACESSE: https://thiagorossi.com.br/category/laravel E SE APROFUNDE AINDA MAIS NO FRAMEWORK PHP MAIS USADO NO MERCADO WEB! - (NOVOS ARTIGOS DIARIAMENTE).


    Compartilhe
    Comentários (0)