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).