In Laravel, handling role-based permissions can be managed using packages like Spatie’s Laravel Permission package, which simplifies adding roles and permissions to your application.
Step 1: Install Spatie Laravel Permission Package
First, install the Spatie Laravel Permission package via Composer:
bash
1 |
composer require spatie/laravel-permission |
Step 2: Publish the Configuration File
After installing the package, publish its configuration and migration files using the following command:
bash
1 |
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" |
This will create a configuration file at config/permission.php
and migration files for roles and permissions tables.
Step 3: Run Migrations
To create the required tables in your database, run the migrations:
bash
1 |
php artisan migrate |
This will create the following tables:
roles
permissions
model_has_roles
model_has_permissions
role_has_permissions
Step 4: Add the HasRoles
Trait to Your User Model
Next, add the HasRoles
trait to your User model to enable role and permission handling for users.
In app/Models/User.php
, import the HasRoles
trait and use it:
php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { use HasRoles; // Other model methods and properties... } |
Step 5: Create Roles and Permissions
You can now create roles and permissions in your Seeder or directly in your code.
Example: Seeder for Roles and Permissions
Create a seeder file to define roles and permissions. Run this command:
bash
1 |
php artisan make:seeder RolePermissionSeeder |
In database/seeders/RolePermissionSeeder.php
, define roles and permissions:
php
1 |
php artisan make:seeder RolePermissionSeeder |
Run the seeder to insert roles and permissions into the database:
bash
1 |
php artisan db:seed --class=RolePermissionSeeder |
Step 6: Assign Roles and Permissions to Users
Now you can assign roles and permissions to users in your application.
Example: Assign Role to User
php
1 2 3 4 5 |
use App\Models\User; use Spatie\Permission\Models\Role; $user = User::find(1); // Find a user by ID $user->assignRole('admin'); // Assign 'admin' role to user |
Example: Assign Permission to a User
php
1 2 3 4 5 |
use App\Models\User; use Spatie\Permission\Models\Role; $user = User::find(1); // Find a user by ID $user->assignRole('admin'); // Assign 'admin' role to user |
Step 7: Checking Roles and Permissions
Now you can check if a user has a certain role or permission using the following methods:
Check Role
php
1 2 3 |
if ($user->hasRole('admin')) { // The user has the 'admin' role } |
Check Permission
php
1 2 3 |
if ($user->can('edit posts')) { // The user can 'edit posts' } |
Step 8: Middleware for Role and Permission
To restrict access to routes or controllers based on roles or permissions, you can use middleware provided by the package.
Example: Role Middleware in Routes
In your routes/web.php
, use the role
middleware:
php
1 2 3 |
Route::get('/admin', function () { return 'Admin Area'; })->middleware('role:admin'); |
Example: Permission Middleware in Routes
Use the permission
middleware to check permissions:
php
1 2 3 |
Route::get('/edit-posts', function () { return 'Edit Posts Page'; })->middleware('permission:edit posts'); |
Step 9: Middleware Configuration (Optional)
If you want to create your own middleware for roles and permissions, you can add custom middleware to app/Http/Kernel.php
:
php
1 2 3 4 |
protected $routeMiddleware = [ 'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class, 'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class, ]; |
Now you can apply these middlewares on routes or controllers to handle access control.
Summary
You’ve successfully set up role-based permission handling using Spatie’s Laravel Permission package. Here’s a quick recap:
- Install the package using Composer.
- Publish configuration and run migrations.
- Use the HasRoles trait in the User model.
- Create roles and permissions using a seeder or in code.
- Assign roles and permissions to users.
- Check roles/permissions in your application.
- Apply middleware for restricting access based on roles or permissions.
- Laravel Breeze – Simple authentication starter kit
- Laravel Jetstream – Scaffolding for Laravel apps
- Laravel Passport – API authentication via OAuth2
- Laravel Sanctum – Simple API authentication
- Spatie Laravel Permission – Role and permission management
- Laravel Cashier – Subscription billing with Stripe
- Laravel Scout – Full-text search using Algolia
- Laravel Socialite – OAuth authentication (Google, Facebook, etc.)
- Laravel Excel – Excel import and export for Laravel
- Laravel Horizon – Redis queues monitoring
- Laravel Nova – Admin panel for Laravel
- Laravel Fortify – Backend authentication for Laravel
- Laravel Vapor – Serverless deployment on AWS
- Laravel Telescope – Debugging assistant for Laravel
- Laravel Dusk – Browser testing
- Laravel Mix – API for compiling assets
- Spatie Laravel Backup – Backup management
- Laravel Livewire – Building dynamic UIs
- Spatie Laravel Media Library – Manage media uploads
- Laravel Excel – Excel spreadsheet handling
- Laravel Debugbar – Debug tool for Laravel
- Laravel WebSockets – Real-time communication
- Spatie Laravel Sitemap – Generate sitemaps
- Laravel Spark – SaaS scaffolding
- Laravel Envoy – Task runner for deployment
- Spatie Laravel Translatable – Multilingual model support
- Laravel Backpack – Admin panel
- Laravel AdminLTE – Admin interface template
- Laravel Collective Forms & HTML – Simplified form and HTML generation
- Spatie Laravel Analytics – Google Analytics integration
- Laravel Eloquent Sluggable – Automatically create slugs
- Laravel Charts – Chart integration
- Laravel Auditing – Track changes in models
- Laravel JWT Auth – JSON Web Token authentication
- Laravel Queue Monitor – Monitor job queues
- Spatie Laravel Query Builder – Filter, sort, and include relationships in Eloquent queries
- Laravel Datatables – jQuery Datatables API
- Laravel Localization – Multilingual support for views and routes
- Laravel Acl Manager – Access control list manager
- Laravel Activity Log – Record activity in your app
- Laravel Roles – Role-based access control
- Spatie Laravel Tags – Tagging models
- Laravel Installer – CLI installer for Laravel
- Laravel Breadcrumbs – Generate breadcrumbs in Laravel
- Laravel Mailgun – Mailgun integration for Laravel
- Laravel Trustup Model History – Store model change history
- Laravel Deployer – Deployment automation tool
- Laravel Auth – Custom authentication guards
- Laravel CORS – Cross-Origin Resource Sharing (CORS) support
- Laravel Notifications – Send notifications through multiple channels
- Spatie Laravel Http Logger – Log HTTP requests
- Laravel Permission Manager – Manage permissions easily
- Laravel Stubs – Customize default stubs in Laravel
- Laravel Fast Excel – Speed up Excel exports
- Laravel Image – Image processing
- Spatie Laravel Backup Server – Centralize backups for Laravel apps
- Laravel Forge API – Manage servers through the Forge API
- Laravel Blade SVG – Use SVGs in Blade templates
- Laravel Ban – Ban/unban users from your application
- Laravel API Response – Standardize API responses
- Laravel SEO – Manage SEO meta tags
- Laravel Settings – Store and retrieve settings
- Laravel DOMPDF – Generate PDFs
- Laravel Turbo – Full-stack framework for building modern web apps
- Spatie Laravel Event Sourcing – Event sourcing implementation
- Laravel Jetstream Inertia – Jetstream’s Inertia.js integration
- Laravel Envoy Tasks – Task automation
- Laravel Likeable – Like/dislike functionality
- Laravel GeoIP – Determine visitor’s geographic location
- Laravel Country State City – Dropdowns for country, state, and city
- Laravel Hashids – Generate short unique hashes
- Laravel Repository – Repository pattern for Laravel
- Laravel UUID – UUID generation for models
- Spatie Laravel Medialibrary Pro – Enhanced media management
- Laravel Queue Monitor – Monitor Laravel job queues
- Laravel User Activity – Monitor user activity
- Laravel DB Snapshots – Create database snapshots
- Laravel Twilio – Twilio integration
- Laravel Roles – Role-based permission handling
- Laravel Translatable – Add translations to Eloquent models
- Laravel Teamwork – Manage teams in multi-tenant apps
- Laravel Full Text Search – Add full-text search to Laravel models
- Laravel File Manager – File and media management
- Laravel User Timezones – Automatically detect user time zones
- Laravel ChartsJS – Render charts with ChartsJS
- Laravel Stripe – Stripe API integration
- Laravel PDF Generator – PDF generation
- Laravel Elasticsearch – Elasticsearch integration
- Laravel Simple Qrcode – Generate QR codes
- Laravel Timezone – Manage timezones and conversions
- Laravel Collective API – API management for Laravel
- Laravel Rest API Boilerplate – REST API starter kit
- Laravel Multi Auth – Multi-authentication functionality
- Laravel Voyager – Admin panel for Laravel
- Laravel Voyager Database – Database manager for Voyager
- Laravel Categories – Handle categories for models
- Laravel Multitenancy – Multi-tenancy implementation
- Laravel Access Control – Advanced access control for users
- Laravel Menus – Menu management
- Laravel Translatable Routes – Multilingual route handling