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