Laravel 7 аутентификация не сохраняется - PullRequest
0 голосов
/ 31 марта 2020

У меня есть пользовательская защита и провайдер, определенные в 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

Я прочитал это, потому что маршруты не имеют * Промежуточное программное обеспечение 1025 * аутентификация не будет сохраняться, но, как вы видите, web включено по умолчанию. У меня есть другой пользовательский сторож, который использует «традиционное» имя пользователя + пароль. Он работает, как и ожидалось.

Мой env для сеанса 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 голосов
/ 31 марта 2020

Типичная ошибка ID10T с моей стороны. Я не осознавал, что реализовал Illuminate\Contracts\Auth\Authenticatable вручную на своей модели, прежде чем расширить класс Illuminate\Foundation\Auth\User. PHPStorm озвучил эти методы для меня ...

Удаление этих методов работало.

0 голосов
/ 31 марта 2020

Здравствуйте, вы входите в метод входа в систему, используя функцию попытки, которая является функцией входа пользователя в систему. Auth::attempts([‘email’ => $request->email, ´password’ => $request->password]);

Это будет проверять, может ли пользователь быть подключен или отклонен (это Аутентификатор по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...