我的应用程序中有两个不同的用户对象,一个App\User
和一个App\Admin
。对于这两者,我有不同的身份验证保护措施。
我的默认防护是模型web
的{{1}}防护,而我也有模型App\User
的{{1}}防护。
例如,此代码
admin
返回
[false,true]
符合预期。
但是,在功能测试中,我正在这样做:
App\Admin
由于某种原因返回
[true,true]
这会导致所有类型的错误(例如,我有一个面向普通用户的日志中间件,并试图以普通用户身份存储admin时会抛出Foreign_key异常等)。
$admin = factory(\App\Admin::class)->make();
\Auth::guard('admin')->login($admin);
dd([\Auth::check(), \Auth::guard('admin')->check()]);
为什么要同时启用两个防护?是Laravel 5.6中的错误,还是我做错了什么?
答案 0 :(得分:3)
当您调用actingAs
方法时,Laravel内部将默认防护更改为admin
。
请使用下面的代码
$defaultGuard = config('auth.defaults.guard');
$admin = factory(\App\Admin::class)->make();
$this->actingAs($admin, 'admin');
\Auth::shouldUse($defaultGuard);
$response = $this->get('/admin');
dd([\Auth::check(), \Auth::guard('admin')->check()]);
您还可以在actingAsAdmin
类中提取方法TestCase
,以便您可以重用该函数。
public function actingAsAdmin($admin) {
$defaultGuard = config('auth.defaults.guard');
$this->actingAs($admin, 'admin');
\Auth::shouldUse($defaultGuard);
return $this;
}
并按如下所示调用此函数。
$admin = factory(\App\Admin::class)->make();
$response = $this->actingAsAdmin($admin)->get('/admin');
dd([\Auth::check(), \Auth::guard('admin')->check()]);