Tutorial de Funções e Permissões de Usuário no Laravel 11

Posted on: June 17, 2025 04:32 PM

Posted by: Renato

Categories: Laravel

Views: 34

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:

  • role
  • permission

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.php
  • app/Http/Controllers/ProductController.php
  • app/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 de resources/views/users/)
  • Módulo de Funções: index.blade.php, create.blade.php, edit.blade.php, show.blade.php (dentro de resources/views/roles/)
  • Módulo de Produtos: index.blade.php, create.blade.php, edit.blade.php, show.blade.php (dentro de resources/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

 

 


1

Share

Donate to Site


About Author

Renato

Developer

Add a Comment

Blog Search


Categories

Laravel (227) PHP (151) linux (124) Variados (110) Dicas (58) ubuntu (58) developer (48) postgresql (45) database (44) sql (42) Docker (32) front-end (31) mysql (31) devops (26) webdev (24) programming (23) aws (19) tecnologia (19) eloquent (19) dba (18) OUTROS (17) backend (16) laravelphp (16) debian (12) dev (12) reactjs (10) 100DaysOfCode (10) git (10) react (10) nginx (9) inteligencia-artificial (9) PHP Swoole (9) node (9) javascript (9) linux-tools (8) Architecture (8) vue (7) github (7) ciencia (7) nodejs (6) api (6) vscode (6) webservice (6) jwt (6) vim (6) windows (6) arquitetura (6) authentication (5) ia (5) reactnative (5) rest (5) DevSecOps (5) servers (5) apache (5) macox (5) s3 (5) Kubernetes (4) gitlab (4) opensource (4) mariadb (4) jenkins (4) shell (4) mongodb (4) angular (4) autenticacao (4) wsl (4) Swoole (4) lets-encrypt (4) query (4) Raspberry (4) angularjs (4) inteligenciadedados (4) Padrao de design (4) artigo (4) google (4) npm (4) openai (4) js (3) mysqli (3) Black Hat (3) RabbitMQ (3) educacao (3) intel (3) CMS (2) sail (3) script (3) performance (3) json (3) authorization (3) phpswoole (3) ddd (3) blade (3) terminal (3) log (3) mac (3) fedora (3) containers (3) ssh (3) bash (3) hardware (3) tests (3) macos (3) web (2) jobs (3) websocket (3) db (3) politica (3) Curisidades (2) Solid (2) zsh (2) Go (2) BigLinux (2) POO (2) LazyVim (2) gource (2) Python (2) Oauth2 (2) android (2) unix (2) magento (2) iot (2) ffmpeg (2) combustivel (2) webhook (2) microservices (2) bancodedados (2) tailwind (2) homeOffice (2) html (2) openswoole (2) artificialintelligence (2) security (2) auth (2) cron (2) phpunit (2) kube (2) multiple_authen (2) policia (2) neovim (2) golang (2) noticias (2) livros (2) Transcribe (2) ElonMusk (2) redis (2) claude (2) ArchLinux (2) java (2) saude (1) seguranca (2) phpfpm (2) autorizacao (2) monitoring (2) laptop (2) gnome (2) powerbi (2) telefonia (2) nvm (2) imagick (2) maps (2) colors (2) Passport (2) JQuery (2) front (1) wine (1) covid19 (0) services (1) phpjasper (1) models (1) kali-linux (1) geojson (1) yarn (1) picpay (1) Monolith (1) banco (1) PNPM (1) Desenvolvedor (1) Structurizr (1) symfony (1) presenter (1) lider (1) guard (1) tensorflow (1) bootstrap (1) nuance (1) historia (1) dropbox (1) traefik (1) bug (1) akitando (1) llm (1) htm (1) transformers (1) cavalotroia (1) odd (1) m1 (1) Error (1) cinnamon (1) repmgr (1) federal (1) ruby (1) AppSec (1) orm (1) ArquiteturaDeSoftware (1) Passwordless (1) memcached (1) flow (1) compression (1) athena (1) Migration (1) workflow (1) cqrs (1) kitematic (1) geospacial (1) yeshua (1) data (1) sonarqube (1) Axios (1) pipelines (1) Mozilla (1) kvm (1) GitOps (1) sqlite (1) podcast (1) n8n (1) LaravelFilament (1) God (1) DesenvolvimentoProfissional (1) sw (1) bigtech (1) postgres (1) NoCookies (1) LeetCode (1) governancadedados (1) prf (1) nosql (1) Lideranca (1) Hackers (1) Bots (1) pytorch (1) nuxt (1) liquid (1) ec2 (1) transaction (1) c4 (1) rancher (1) algoritimo (1) Observability (1) Elasticsearch (1) translate (1) certbot (1) Oh My Zsh (1) ibm (1) escopos (1) usb (1) ckeditor (1) API_KEY_GOOGLE_MAPS (1) Manjaro (1) vicuna (1) coding (1) rust (1) markdown (1) JasperReports (1) Fibonacci (1) community (1) Samurai (1) payment (1) messaging (1) Jesus (1) flutter (1) militar (1) fullsta (1) smartphones (1) automacao (1) Monitor (1) zend (1) spaceship (1) PKCE (1) l2tp (1) Glacier (1) laraveloctane (1) Deus (1) binaural (1) gpt (1) bolsonaro (1) privacidade (1) linkedin (1) documentation (1) brain (1) adb (1) nvidia (1) host (1) ecommerce (1) c4-models (1) altadisponibilidade (1) octane (1) lucena (1) http (1) TypeScript (1) chatgpt (1) idiomas (1) eventdrive (1) uuid (1) restfull (1) aplicativo (1) optimization (1) mapas (1) Fetch (1) collections (1) RustLang (1) matematica (1) Filament (1) compactar (1) paypal (1) microg (1) forcas armadas (1) cor (1) auth (1) modelagemdedados (1) k8s (1) gasolina (1) wsl2 (1) csv (1) soap (1) piada (1) KubeCon (1) zorin-os (1) spring-boot (1) backup (1) playwright (1) Deepin (1) storage (1) benchmark (1) networking (1) Swoole (1) biologia (1) node-red (1) LETSENCRYPT (1) Grunt (1) Diagramas (1) boot (1) haru (1) dracula (1) TrabalhoEmEquipe (1) Brasil (1) queue (1) agi (1) llama (1) hotfix (1) economia (1) transcription (1) cache (1) Amazon (1) October (1) lumen (1) Hyperf (1) replication (1) faceapp (1) vala (1) cloudstack (1) rpi (1) apple (1) oracle (1) iode (1) ffaa (1) vpn (1) MeioAmbiente (1) firefox (1) composer (1) scheduling (1) Asahi (1) pendrive (1) microservice (1) front (1) OOD (0) controllers (0)

New Articles



Get Latest Updates by Email