User Role and Redirection Guide

Step 1: Set Up Role-Based Authentication

Create Migration for Roles:

php artisan make:migration create_roles_table --create=roles

Add the following schema to the migration file:


public function up()
{
    Schema::create('roles', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
}
                    

Create Migration for Role_User Pivot Table:

php artisan make:migration create_role_user_table --create=role_user

Add the following schema to the migration file:


public function up()
{
    Schema::create('role_user', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->onDelete('cascade');
        $table->foreignId('role_id')->constrained()->onDelete('cascade');
        $table->timestamps();
    });
}
                    

Run Migrations:

php artisan migrate
Step 2: Define Relationships in Models

Role Model:

php artisan make:model Role

Add the relationship to the Role model:


namespace App\Models;

use Illuminate\Database\Eloquent\Model;

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

User Model:


namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;

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

    public function hasRole($role)
    {
        return $this->roles()->where('name', $role)->exists();
    }
}
                    
Step 3: Seed the Roles Table

Create a seeder for roles:

php artisan make:seeder RolesTableSeeder

Add the following roles in the seeder:


namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\Role;

class RolesTableSeeder extends Seeder
{
    public function run()
    {
        Role::create(['name' => 'admin']);
        Role::create(['name' => 'user']);
    }
}
                    

Run the seeder:

php artisan db:seed --class=RolesTableSeeder

Step 4: Middleware for Role-Based Access

Create middleware for role checking:

php artisan make:middleware CheckRole

Add the role check logic:


namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckRole
{
    public function handle(Request $request, Closure $next, $role)
    {
        if (!$request->user() || !$request->user()->hasRole($role)) {
            return redirect('/');
        }

        return $next($request);
    }
}
                    

Register the middleware in Kernel.php:


protected $routeMiddleware = [
    // Other middleware
    'role' => \App\Http\Middleware\CheckRole::class,
];
                    
Step 5: Apply Middleware in Routes

Apply middleware in the web routes file:


use Illuminate\Support\Facades\Route;

Route::get('/admin', function () {
    return 'Welcome Admin!';
})->middleware('role:admin');

Route::get('/user', function () {
    return 'Welcome User!';
})->middleware('role:user');