当用户首次通过手动提供给用户的电子邮件和密码登录时。需要强制他们输入新密码(密码和确认密码-仅两个字段)。
我创建了一个中间件:
class FirstTimeLogin
{
public function handle($request, Closure $next)
{
if ($request->user()->first_time_login) {
return redirect()->route('setup-password');
}
return $next($request);
}
}
在Kernel.php
中,我在\App\Http\Middleware\FirstTimeLogin::class
数组中添加了$middlewareGroups
:例如:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\FirstTimeLogin::class
]
];
web.php路由如下:
Route::group(['middleware' => ['auth']], function () {
Route::get('/home', 'HomeController@index')->name('home');
Route::get('/password/setup-password', 'Auth\SetupPasswordController@resetPasswordFirstTime')->name('setup-password');
Route::post('/password/setup-password', 'Auth\SetupPasswordController@updatePassword');
});
问题是它会在浏览器上多次重定向,从而在浏览器上导致ERR_TOO_MANY_REDIRECTS
错误。如何解决这个问题?
答案 0 :(得分:1)
您刚刚将新的中间件应用于所有网络路由,因此当用户重定向到->route('setup-password')
时,中间件会再次出现,因此您可以进行无限重定向
解决此问题的一种方法是为这两个用于设置密码的路由创建排除项
确保为第二条路线命名,例如setup-password-post
然后更改中间件的代码:
if ($request->user()->first_time_login) {
if (!in_array(Route::currentRouteName(), ['setup-password', 'setup-password-post'])) {
return redirect()->route('setup-password');
}
}
答案 1 :(得分:0)
您需要检查一下以确保当前路径不是setup-password
。
尝试将if语句更改为类似以下内容:
if ($request->user()->first_time_login && !$request->is('setup-password')) {