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:
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: