Laravel实现登录后禁止访问confirm与password页面的问题求助
解决Laravel登录用户无法访问confirm和password页面的问题
核心问题排查
你之前的中间件未生效,大概率是没把中间件绑定到目标路由上,Laravel不会自动将自定义中间件应用到路由,必须显式指定。以下是具体解决方案:
方案一:用自定义中间件实现
1. 注册中间件
打开app/Http/Kernel.php,在$routeMiddleware数组中添加你的中间件(假设中间件类名为RedirectAuthenticated):
'redirect.authenticated' => \App\Http\Middleware\RedirectAuthenticated::class,
2. 绑定中间件到路由
修改路由配置,给confirm和password路由加上该中间件:
Route::get('/confirm', [App\Http\Controllers\Auth\MobileController::class, 'confirm']) ->name('confirm') ->middleware('redirect.authenticated'); Route::get('/password', [App\Http\Controllers\Auth\MobileController::class, 'password']) ->name('password') ->middleware('redirect.authenticated');
3. 优化中间件逻辑(更可靠)
把原中间件逻辑简化,改用路由名称匹配(比request->is()更准确,避免路由前缀/参数干扰):
public function handle(Request $request, Closure $next): Response { if (Auth::check()) { // 匹配路由名称而非URL路径 if ($request->routeIs('confirm') || $request->routeIs('password')) { return redirect(RouteServiceProvider::HOME); } } return $next($request); }
方案二:复用Laravel自带的guest中间件
Laravel自带的guest中间件本来就是限制已登录用户访问登录类页面的,直接修改它更省事:
1. 修改RedirectIfAuthenticated中间件
打开app/Http/Middleware/RedirectIfAuthenticated.php,更新handle方法:
public function handle(Request $request, Closure $next, string ...$guards): Response { $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { // 新增对confirm和password路由的判断 if ($request->routeIs('confirm') || $request->routeIs('password')) { return redirect(RouteServiceProvider::HOME); } return redirect(RouteServiceProvider::HOME); } } return $next($request); }
2. 给路由绑定guest中间件
Route::get('/confirm', [App\Http\Controllers\Auth\MobileController::class, 'confirm']) ->name('confirm') ->middleware('guest'); Route::get('/password', [App\Http\Controllers\Auth\MobileController::class, 'password']) ->name('password') ->middleware('guest');
内容的提问来源于stack exchange,提问作者irankhostravi
相关产品推荐
相关产品推荐

