Posted on: June 17, 2025 04:32 PM
Posted by: Renato
Categories: Laravel
Views: 35
Tutorial de Funções e Permissões de Usuário no Laravel 11
Neste tutorial, compartilharei com você como implementar funções e permissões de usuário usando o pacote spatie/laravel-permission em uma aplicação Laravel 11.
Estamos usando o pacote da Spatie para gerenciar funções e permissões na aplicação Laravel 11. Basta seguir os passos abaixo para criar um ACL (Controle de Acesso a Listas) no Laravel 11.
O pacote Composer da Spatie para funções e permissões oferece uma maneira de criar um ACL no Laravel 11. Ele fornece instruções sobre como atribuir uma função a um usuário, como atribuir uma permissão a um usuário e como atribuir permissões a funções. Escreverei instruções passo a passo para criar funções e permissões na aplicação Laravel 11.
Funções e permissões permitem que você crie vários tipos de usuários com diferentes papéis e acessos. Por exemplo, alguns usuários podem apenas visualizar a listagem de um módulo de itens, enquanto outros também podem editar e excluir esses itens.
Neste exemplo, criei três módulos listados abaixo:
- Gerenciamento de Usuários
- Gerenciamento de Funções
- Gerenciamento de Produtos
Após registrar um usuário, ele não terá nenhuma função. Então, você pode editar seus detalhes e atribuir a si mesmo a função de 'admin' no Gerenciamento de Usuários. Depois disso, você pode criar suas próprias funções com permissões como role-list, role-create, role-edit, role-delete, product-list, product-create, product-edit, product-delete. Você pode testar isso atribuindo a um novo usuário e verificando seu acesso.
Passos para o Exemplo de ACL no Laravel 11 - Funções e Permissões
- Passo 1: Instalar o Laravel 11
- Passo 2: Instalar o Pacote
spatie/laravel-permission - Passo 3: Criar a Migration de
Product - Passo 4: Criar os Models
- Passo 5: Adicionar o Middleware
- Passo 6: Criar a Autenticação
- Passo 7: Criar as Rotas
- Passo 8: Adicionar os Controllers
- Passo 9: Adicionar os Arquivos Blade
- Passo 10: Criar um Seeder para Permissões e Usuário Admin
Passo 1: Instalar o Laravel 11
Primeiro, precisamos obter uma nova aplicação Laravel 11 usando o comando abaixo, pois estamos começando do zero. Abra seu terminal ou prompt de comando e execute o comando:
Bash
composer create-project laravel/laravel exemplo-app
Passo 2: Instalar o Pacote spatie/laravel-permission
Agora, precisamos instalar o pacote da Spatie para ACL. Dessa forma, podemos usar seus métodos. Execute o seguinte comando no seu terminal:
Bash
composer require spatie/laravel-permission
Podemos também customizar as configurações do pacote da Spatie. Se você quiser fazer alterações, pode executar o comando abaixo para publicar o arquivo de configuração em config/permission.php e os arquivos de migration.
Bash
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
Agora você verá o arquivo permission.php e uma nova migration. Execute a migration usando o seguinte comando:
Bash
php artisan migrate
Passo 3: Criar a Migration de Product
Neste passo, vamos criar uma migration para a tabela products usando o comando abaixo:
Bash
php artisan make:migration create_products_table
Migration da tabela products:
PHP
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('detail');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down(): void
{
Schema::dropIfExists('products');
}
};
Agora, execute a migration:
Bash
php artisan migrate
Passo 4: Criar os Models
Neste passo, criaremos os models para as tabelas User e Product. Se você começou um projeto novo, já terá o model User; apenas substitua o código. Para o outro, você precisará criá-lo.
app/Models/User.php
PHP
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasFactory, Notifiable, HasRoles;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* Get the attributes that should be cast.
*
* @return array
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
}
app/Models/Product.php
PHP
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
use HasFactory;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'detail'
];
}
Passo 5: Adicionar o Middleware
O pacote da Spatie fornece seus próprios middlewares, que podemos usar de forma simples:
rolepermission
Temos que adicionar os apelidos (aliases) do middleware no arquivo bootstrap/app.php:
bootstrap/app.php
PHP
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class
]);
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
Passo 6: Criar a Autenticação
Você precisa seguir alguns passos para criar a autenticação na sua aplicação Laravel 11.
Primeiro, instale o pacote laravel/ui:
Bash
composer require laravel/ui
Agora, gere o scaffolding de autenticação com o Bootstrap usando o Laravel UI:
Bash
php artisan ui bootstrap --auth
Você precisa rodar os comandos do NPM para que o layout das páginas de login e registro seja exibido corretamente.
Instale o NPM:
Bash
npm install
Execute o NPM:
Bash
npm run build
Passo 7: Criar as Rotas
Precisamos adicionar várias rotas para os módulos de usuários, produtos e funções. Nestas rotas, eu também uso middleware com permissões. Adicione as seguintes rotas:
routes/web.php
PHP
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomeController;
use App\Http\Controllers\RoleController;
use App\Http\Controllers\UserController;
use App\Http\Controllers\ProductController;
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/home', [HomeController::class, 'index'])->name('home');
Route::group(['middleware' => ['auth']], function() {
Route::resource('roles', RoleController::class);
Route::resource('users', UserController::class);
Route::resource('products', ProductController::class);
});
Passo 8: Adicionar os Controllers
Neste passo, adicionamos três controllers para os módulos de usuários, produtos e funções. Crie os três controllers como abaixo:
app/Http/Controllers/UserController.phpapp/Http/Controllers/ProductController.phpapp/Http/Controllers/RoleController.php
(O código dos controllers é extenso e não precisa de tradução, pois é PHP. Você pode copiar o código original fornecido na pergunta para cada um desses arquivos.)
Passo 9: Adicionar os Arquivos Blade
Neste passo, precisamos criar os seguintes arquivos blade:
- Layout Principal:
resources/views/layouts/app.blade.php - Módulo de Usuários:
index.blade.php,create.blade.php,edit.blade.php,show.blade.php(dentro deresources/views/users/) - Módulo de Funções:
index.blade.php,create.blade.php,edit.blade.php,show.blade.php(dentro deresources/views/roles/) - Módulo de Produtos:
index.blade.php,create.blade.php,edit.blade.php,show.blade.php(dentro deresources/views/products/)
Abaixo estão os códigos para os arquivos mais importantes, com os textos traduzidos.
resources/views/layouts/app.blade.php (trecho traduzido)
HTML
@guest
@if (Route::has('login'))
<li class="nav-item">
<a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
</li>
@endif
@if (Route::has('register'))
<li class="nav-item">
<a class="nav-link" href="{{ route('register') }}">{{ __('Registrar') }}</a>
</li>
@endif
@else
<li><a class="nav-link" href="{{ route('users.index') }}">Gerenciar Usuários</a></li>
<li><a class="nav-link" href="{{ route('roles.index') }}">Gerenciar Funções</a></li>
<li><a class="nav-link" href="{{ route('products.index') }}">Gerenciar Produtos</a></li>
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
{{ Auth::user()->name }}
</a>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{{ route('logout') }}"
onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
{{ __('Logout') }}
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
@csrf
</form>
</div>
</li>
@endguest
resources/views/users/index.blade.php
HTML
@extends('layouts.app')
@section('content')
<div class="row">
<div class="col-lg-12 margin-tb">
<div class="pull-left">
<h2>Gerenciamento de Usuários</h2>
</div>
<div class="pull-right">
<a class="btn btn-success mb-2" href="{{ route('users.create') }}"><i class="fa fa-plus"></i> Criar Novo Usuário</a>
</div>
</div>
</div>
@session('success')
<div class="alert alert-success" role="alert">
{{ $value }}
</div>
@endsession
<table class="table table-bordered">
<tr>
<th>Nº</th>
<th>Nome</th>
<th>Email</th>
<th>Funções</th>
<th width="280px">Ação</th>
</tr>
@foreach ($data as $key => $user)
<tr>
<td>{{ ++$i }}</td>
<td>{{ $user->name }}</td>
<td>{{ $user->email }}</td>
<td>
@if(!empty($user->getRoleNames()))
@foreach($user->getRoleNames() as $v)
<label class="badge bg-success">{{ $v }}</label>
@endforeach
@endif
</td>
<td>
<a class="btn btn-info btn-sm" href="{{ route('users.show',$user->id) }}"><i class="fa-solid fa-list"></i> Ver</a>
<a class="btn btn-primary btn-sm" href="{{ route('users.edit',$user->id) }}"><i class="fa-solid fa-pen-to-square"></i> Editar</a>
<form method="POST" action="{{ route('users.destroy', $user->id) }}" style="display:inline">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm"><i class="fa-solid fa-trash"></i> Deletar</button>
</form>
</td>
</tr>
@endforeach
</table>
{!! $data->links('pagination::bootstrap-5') !!}
@endsection
resources/views/users/create.blade.php (tradução das labels)
- "Create New User": "Criar Novo Usuário"
- "Back": "Voltar"
- "Name": "Nome"
- "Password": "Senha"
- "Confirm Password": "Confirmar Senha"
- "Role": "Função"
- "Submit": "Enviar"
Passo 10: Criar um Seeder para Permissões e Usuário Admin
O último passo é criar um seeder para popular o banco de dados com as permissões iniciais (role-list, product-create, etc.) e criar um usuário administrador padrão que já tenha todas as permissões. Isso garante que você possa fazer login e começar a gerenciar o sistema imediatamente.
Você pode criar um seeder com o comando:
php artisan make:seeder PermissionSeeder
Dentro do seeder, você criará as permissões, a função de "Admin", atribuirá todas as permissões a essa função e, finalmente, criará um usuário e atribuirá a ele a função de "Admin".
Execute a Aplicação Laravel
Finalmente, execute o servidor de desenvolvimento do Laravel para ver sua aplicação em ação:
php artisan serve
Agora você pode acessar sua aplicação, registrar um novo usuário, atribuir a função de "Admin" a ele e começar a testar o sistema de funções e permissões.
php artisan make:seeder CreateAdminUserSeeder
php artisan db:seed --class=PermissionTableSeeder
database/seeders/CreateAdminUserSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\User;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
class CreateAdminUserSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$user = User::create([
'name' => 'Hardik Savani',
'email' => '[email protected]',
'password' => bcrypt('123456')
]);
$role = Role::create(['name' => 'Admin']);
$permissions = Permission::pluck('id','id')->all();
$role->syncPermissions($permissions);
$user->assignRole([$role->id]);
}
}
Then, run seeder using the following command:
php artisan db:seed --class=CreateAdminUserSeeder
Fonte: https://www.itsolutionstuff.com/post/laravel-11-user-roles-and-permissions-tutorialexample.html
Donate to Site
Renato
Developer