image

Acesse bootcamps ilimitados e +650 cursos

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

Você pode, você não pode: Permissões com Laravel Authorization

  • #PHP
  • #Laravel

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)