Laravel 8如何实现角色登录后重定向到nwidart模块
Laravel 8 多角色登录按角色重定向到nwidart模块实现方案
基于你当前已完成Jetstream+Fortify配置、角色体系搭建、各模块页面可正常访问的前提,按以下步骤配置即可实现需求:
1. 自定义Fortify登录成功响应
Fortify默认登录后跳转路径写死在RouteServiceProvider的HOME常量,不支持多角色动态判断,需要替换默认的登录响应实现:
- 新建
app/Http/Responses/LoginResponse.php文件,代码如下:
<?php namespace App\Http\Responses; use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract; use Illuminate\Support\Facades\Auth; class LoginResponse implements LoginResponseContract { public function toResponse($request) { $user = Auth::user(); // 按角色匹配对应模块首页路径 $redirectPath = match (true) { $user->hasRole('SuperAdmin') => route('superadmin.dashboard'), $user->hasRole('Admin') => route('admin.dashboard'), $user->hasRole('User') => route('user.dashboard'), default => route('dashboard') }; return $request->wantsJson() ? response()->json(['two_factor' => false]) : redirect()->intended($redirectPath); } }
如果你没有用spatie角色权限包,直接把判断条件替换为你自己的角色字段判断即可,例如
$user->role === 'super_admin'。路径建议用route()辅助函数绑定路由名,避免后续调整路由前缀时需要修改多处代码。
2. 绑定自定义响应到容器
打开app/Providers/FortifyServiceProvider.php,在boot方法中添加绑定,替换默认的登录响应:
use App\Http\Responses\LoginResponse; use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract; public function boot() { // 原有其他Fortify配置代码保留 // ... $this->app->singleton(LoginResponseContract::class, LoginResponse::class); }
3. 修正已登录用户的重定向逻辑
打开app/Http/Middleware/RedirectIfAuthenticated.php,修改已登录用户访问登录页时的跳转规则,和登录后判断逻辑保持一致,避免跳转错位:
public function handle($request, Closure $next, ...$guards) { $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { $user = Auth::guard($guard)->user(); $redirectPath = match (true) { $user->hasRole('SuperAdmin') => route('superadmin.dashboard'), $user->hasRole('Admin') => route('admin.dashboard'), $user->hasRole('User') => route('user.dashboard'), default => route('dashboard') }; return redirect($redirectPath); } } return $next($request); }
4. 核对模块路由配置
打开各个nwidart模块下的Routes/web.php文件,确认路由配置和跳转规则匹配,以SuperAdmin模块为例:
Route::group([ 'prefix' => 'super-admin', 'as' => 'superadmin.', 'middleware' => ['web', 'auth', 'role:SuperAdmin'] // 加上角色校验中间件做权限拦截 ], function () { Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); });
其他Admin、User模块按相同规则配置即可。
配置生效操作
完成以上修改后,在项目根目录执行以下命令清除缓存,避免配置不生效:
php artisan route:clear php artisan config:clear
如果开启了双因素认证、邮箱验证功能,对应重写TwoFactorLoginResponse、VerifyEmailResponse的实现即可,角色判断逻辑和上述代码保持一致。
效果参考:


内容的提问来源于stack exchange,提问作者Arien
相关产品推荐
相关产品推荐

