Instead of:
Route::middleware(['role:super admin|admin|additional admin'])->group(function () {
Use:
Route::middleware(['role_or_permission:super admin|admin|additional admin'])->group(function () {
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
Hi, so I'm trying to redirect users according to the role of them to their dashboards. But when I login the page redirects back to the login page, and not the link it is supposed to go to. When I remove the auth middleware the page redirects but I get a 403 :user not logged in error. This is my code :
AuthContoller.php :
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\Models\Login;
use App\Models\Signup;
use App\Models\User;
use App\Http\Controllers\Controller;
class AuthController extends Controller
{
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
$role = $request->input('role');
$guard = $this->getGuardByRole($role);
if (!$guard) {
return redirect()->route('login')->with('error', 'Invalid role');
}
Auth::shouldUse($guard);
if (Auth::guard($guard)->attempt($credentials)) {
// Authentication successful
switch ($role) {
case 'super admin':
case 'admin':
case 'additional admin':
// $role = auth()->user()->role;
return redirect()->route('admin');
break;
case 'user':
// $role = auth()->user()->role;
return redirect()->route('user');
break;
}
}
// return view($viewName, ['userRole' => $userRole]);
return redirect()->route('login')->with('error', 'Invalid login credentials');
}
protected function getGuardByRole($role)
{
switch ($role) {
case 'user':
return 'web';
case 'super admin':
case 'additional admin':
return 'sadmin';
case 'admin':
return 'admin';
default:
// Handle default or unknown role
return null;
}
}
}
web.php :
// user login page
Route::get('login', function () {
return view('commons.login');
});
Route::post('/login', [AuthController::class, 'login'])->name('login');
Route::middleware(['auth'])->group(function () {
Route::middleware(['role:super admin|admin|additional admin'])->group(function () {
Route::get('admin/home', function () {
return view('admin.home');
})->name('admin');
});
Route::middleware(['role:user'])->group(function () {
Route::get('user/home', function () {
return view('user.home');
})->name('user');
});
});
config/auth.php :
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Signup::class,
],
'sadmins' => [
'driver' => 'eloquent',
'model' => App\Models\Login::class,
],
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins', // Use a custom 'admins' provider for the 'admin' guard
],
'sadmin' => [
'driver' => 'session',
'provider' => 'sadmins', // Use a custom 'admins' provider for the 'admin' guard
],
],
kernel.php :
protected $routeMiddleware = [
'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
];
protected $middlewareAliases = [
'auth' => \App\Http\Middleware\Authenticate::class,
Please help
Please or to participate in this conversation.