首页 > 解决方案 > Laravel - 首次用户

问题描述

当用户第一次通过电子邮件和手动给用户的密码登录时。他们需要被强制输入新密码(密码和确认密码——只有两个字段)。

我创建了一个中间件:

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出错。如何解决这个问题?

标签: phplaravellaravel-5

解决方案


您刚刚将新的中间件应用于所有 Web 路由,因此当用户被重定向到->route('setup-password')中间件时再次启动,因此您有无限重定向

解决此问题的一种方法是为用于密码设置的 2 条路由创建排除项

确保为第二条路线命名,例如setup-password-post

然后更改中间件的代码:

if ($request->user()->first_time_login) {
    if (!in_array(Route::currentRouteName(), ['setup-password', 'setup-password-post'])) {
        return redirect()->route('setup-password');
    }
}

推荐阅读