Laravel 8如何实现OTP验证后才可访问注册页,否则跳转登录?
问题分析与解决方案
你遇到的核心问题有两个:中间件逻辑完全写反,以及默认Auth路由覆盖了你自定义的带中间件的注册路由,导致未验证用户仍能随意访问注册页。下面一步步帮你解决:
1. 修正中间件逻辑
你的当前中间件逻辑和需求完全相反:现在是「有OTP验证Cookie就跳注册页,没Cookie就放行」,但你需要的是「只有验证过(有Cookie)才能进注册页,没验证就跳登录页」。
修改你的OTPVarification中间件代码:
public function handle(Request $request, Closure $next) { // 检查是否存在OTP验证通过的Cookie if (!Cookie::get('otpVerified')) { // 未验证,跳转到登录页(如果有单独的OTP验证页,替换成对应路由名即可) return redirect()->route('login'); } // 已验证,允许访问注册页 return $next($request); }
2. 修复路由优先级问题
Auth::routes()会自动生成一套默认的Auth路由(包括注册页路由),而且它的注册顺序在你自定义的register路由之后,会直接覆盖你的带中间件的路由,导致中间件根本没生效。
解决方法是先禁用默认的注册路由,再自定义带中间件的注册路由:
修改你的web路由代码:
Route::get('language/{key}', [SwitchLanguageController::class, 'switchLanguage'])->name('language'); // 禁用默认的注册路由,保留其他Auth路由(登录、密码重置等) Auth::routes(['register' => false]); // 自定义带OTP验证中间件的注册路由 Route::get('register', [RegisterController::class, 'showRegistrationForm'])->name('register')->middleware(['otpVerify']); Route::group(['middleware' => 'auth'], function (){ Route::get('/404', [\App\Http\Controllers\ErrorController::class, 'notFound'])->name('404'); Route::get('/', [\App\Http\Controllers\Dashboard\DashboardController::class, 'index'])->name('dashboard'); });
3. 额外注意事项
- 确保你在OTP验证通过后,正确设置了
otpVerifiedCookie,比如:// 验证通过后设置Cookie,有效期可根据需求调整(示例为1小时) return redirect()->route('register')->cookie('otpVerified', 'true', 60); - 生产环境建议把Cookie设置为
HttpOnly和Secure,提升安全性:return redirect()->route('register')->cookie( 'otpVerified', 'true', 60, null, null, env('APP_ENV') === 'production', true );
这样调整后,未通过OTP验证的用户访问注册页时,会被自动跳转到登录页;只有验证通过且持有有效Cookie的用户,才能正常访问注册表单。
内容的提问来源于stack exchange,提问作者Irshad Khan
相关产品推荐
相关产品推荐

