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');