【问题标题】:Laravel - First Time UserLaravel - 首次用户
【发布时间】:2019-01-22 19:36:21
【问题描述】:

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

我已经创建了一个中间件:

class FirstTimeLogin
{
    public function handle($request, Closure $next)
    {

        if ($request->user()->first_time_login) {
            return redirect()->route('setup-password');
        }

        return $next($request);
    }
}

Kernel.php 中我已经在$middlewareGroups 数组中添加了\App\Http\Middleware\FirstTimeLogin::class:例如:

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

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    您刚刚将新的中间件应用于所有 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');
        }
    }
    

    【讨论】:

    • 这能解决吗?当用户提交 POST 更新密码时,它将被重定向到 'Auth\SetupPasswordController@updatePassword' 控制器。
    • 你会亲自把新的中间件放到所有的网络路由上吗?
    • 您将表单提交到命名路由,并且在请求被传递到 SetupPasswordController@updatePassword 中间件之前将启动,名称检查不应启动重定向
    • 我不会,最好更改登录功能以检查 ->first_time_login 并在确认用户凭据后立即启动重定向
    • 哦,我知道你不想让他们在他们第一次登录后更改密码之前做任何事情,而不是你需要一个像你最初设计的中间件
    【解决方案2】:

    您需要检查以确保当前路线不是setup-password

    尝试将您的 if 语句更改为:

    if ($request->user()->first_time_login && !$request->is('setup-password')) {
    

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 2016-04-30
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 2018-12-12
      • 2017-10-14
      • 1970-01-01
      相关资源
      最近更新 更多