Laravel 7身份验证未持久

时间:2020-03-31 02:09:06

标签: laravel

我在config/auth.php中定义了一个自定义防护和提供程序:

'guards' => [
    // ...

    'interviewers' => [
        'driver' => 'session',
        'provider' => 'interviewers',
    ],

    // ...
],

'providers' => [
    // ...

    'interviewers' => [
        'driver' => 'eloquent',
        'model' => App\Interviewer::class,
    ],

    // ...
],

我的App\Interviewer模型扩展了Illuminate\Foundation\Auth\User

我的身份验证路由正确进行了身份验证:

public function login($token)
{
    $interviewer = Interviewer::where('token', $token)
        ->firstOrFail();

    auth('interviewers')->login($interviewer);

    $interviewer->update(['logged_in_at' => now()]);

    // outputs: "in login controller - 1"
    dump('in login controller - ' . auth('interviewers')->check());

    return redirect()->route('interviews.edit');
}

但是在使用auth中间件的情况下,

Route::middleware('auth:interviewers')->group(function () {
    Route::get('/interview/{form?}', 'InterviewController@edit')
        ->name('interviews.edit');
});

它从未进行过身份验证,并将我重定向到login路由。在Illuminate\Auth\Middleware\Authenticate中进行一些调试:

protected function authenticate($request, array $guards)
{
    if (empty($guards)) {
        $guards = [null];
    }

    foreach ($guards as $guard) {
        // outputs "interviewers middleware - "
        dump($guard . ' middleware - ' . $this->auth->guard($guard)->check());

        if ($this->auth->guard($guard)->check()) {
            return $this->auth->shouldUse($guard);
        }
    }

    $this->unauthenticated($request, $guards);
}

artisan route:list时,这是我的路线:

GET|HEAD  | interviews/{token} | interviewers.login | App\Http\Controllers\Auth\InterviewerLoginController@login | web
GET|HEAD  | interview/{form?}  | interviews.edit    | App\Http\Controllers\InterviewController@edit              | web,auth:interviewers

我已经读到,因为路由没有web中间件,所以身份验证不会持续,但是您可以看到web是默认包含的。我还有另一个使用“传统”用户名和密码的自定义防护。它按预期工作。

我的会话环境为SESSION_DRIVER=file,我的其他警卫正在按预期工作。

更新

我忘了提到我对此进行了测试并且通过了:

public function test_can_log_in_with_valid_token()
{
    $applicant = Applicant::all()->random();
    $interviewer = factory(Interviewer::class)->make();
    $interviewer->token = Str::random();
    $interviewer = $applicant->interviewers()->save($interviewer);

    $this->get(route('interviewers.login', $interviewer->token))
        ->assertRedirect();

    $this->assertAuthenticatedAs($interviewer, 'interviewers');
}

2 个答案:

答案 0 :(得分:0)

您好,您的登录方法使用尝试功能,该功能是我认为具有持久性的登录用户的功能。 Auth::attempts([‘email’ => $request->email, ´password’ => $request->password]);

这将验证用户是否可以连接或拒绝(这是默认的身份验证器)。

答案 1 :(得分:0)

我典型的ID10T错误。我没有意识到在扩展Illuminate\Contracts\Auth\Authenticatable类之前,我已经在模型上手动实现了Illuminate\Foundation\Auth\User。 PHPStorm已为我解决了这些方法...

删除这些存根方法有效。