Role and Permission Manager in Laravel

Role & Permission Manager in Laravel (Complete Guide)

Managing roles and permissions is critical for building secure and scalable Laravel applications. In this guide, you’ll learn how to implement a robust Role-Based Access Control (RBAC) system from scratch.


📌 What is RBAC?

RBAC (Role-Based Access Control) allows you to assign permissions to roles and roles to users.

Example: Admin → Manage Users, Editor → Edit Posts, User → View Content

🛠 Step 1: Database Structure

roles
- id
- name

permissions
- id
- name

role_permission
- role_id
- permission_id

user_role
- user_id
- role_id

This structure supports many-to-many relationships between users, roles, and permissions.


⚙️ Step 2: Create Models & Relationships

class User extends Model {
    public function roles() {
        return $this->belongsToMany(Role::class);
    }
}

class Role extends Model {
    public function permissions() {
        return $this->belongsToMany(Permission::class);
    }
}

class Permission extends Model {
    public function roles() {
        return $this->belongsToMany(Role::class);
    }
}

🔁 Step 3: Assign Roles & Permissions

$user->roles()->attach($roleId);

$role->permissions()->attach($permissionId);

You can also sync roles:

$user->roles()->sync([1,2]);

🔐 Step 4: Check Permissions

public function hasPermission($permission)
{
    return $this->roles()
        ->whereHas('permissions', function ($query) use ($permission) {
            $query->where('name', $permission);
        })->exists();
}

🚧 Step 5: Create Middleware

php artisan make:middleware CheckPermission
public function handle($request, Closure $next, $permission)
{
    if (!auth()->user() || !auth()->user()->hasPermission($permission)) {
        abort(403, 'Unauthorized');
    }

    return $next($request);
}

Register in Kernel:

'permission' => \App\Http\Middleware\CheckPermission::class,

📍 Step 6: Use in Routes

Route::get('/admin', function () {
    return "Admin Panel";
})->middleware('permission:manage_users');

🧠 Step 7: Use Gates (Alternative)

Gate::define('manage-users', function ($user) {
    return $user->hasPermission('manage_users');
});
@can('manage-users')
    <button>Delete User</button>
@endcan

🚀 Step 8: Optimization Tips

  • Cache roles & permissions using Redis
  • Avoid repeated DB queries
  • Use eager loading

⚠️ Common Mistakes

  • Checking permissions directly in controllers everywhere
  • No caching → slow performance
  • Hardcoding roles

🔥 Bonus: Use Package

Instead of building from scratch, you can use:

👉 :contentReference[oaicite:0]{index=0}

It provides:

  • Easy role & permission management
  • Blade directives
  • Middleware support

🎯 Conclusion

A well-structured role and permission system improves security and maintainability. Using RBAC, middleware, and caching ensures your Laravel app scales efficiently.