我在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');
}
答案 0 :(得分:0)
您好,您的登录方法使用尝试功能,该功能是我认为具有持久性的登录用户的功能。 Auth::attempts([‘email’ => $request->email, ´password’ => $request->password]);
这将验证用户是否可以连接或拒绝(这是默认的身份验证器)。
答案 1 :(得分:0)
我典型的ID10T错误。我没有意识到在扩展Illuminate\Contracts\Auth\Authenticatable
类之前,我已经在模型上手动实现了Illuminate\Foundation\Auth\User
。 PHPStorm已为我解决了这些方法...
删除这些存根方法有效。