我的应用程序中有两个不同的用户对象,一个
App\User
和一个 App\Admin
。对于两者,我有不同的警卫进行身份验证。
我的默认防护是模型
web
的App\User
防护,我也有模型admin
的App\Admin
防护。
例如这段代码
$admin = factory(\App\Admin::class)->make();
\Auth::guard('admin')->login($admin);
dd([\Auth::check(), \Auth::guard('admin')->check()]);
退货
[假,真]
正如预期的那样。
但是,在我的功能测试中我正在这样做:
$admin = factory(\App\Admin::class)->make();
$response = $this->actingAs($admin, 'admin')
->get('/admin');
dd([\Auth::check(), \Auth::guard('admin')->check()]);
由于某种原因返回
[真实,真实]
这会导致各种错误(例如,我有一个针对普通用户的日志中间件,并且尝试将管理员存储为普通用户会引发foreign_key异常等)。
为什么
actingAs
启用两个守卫?这是 Laravel 5.6 中的错误还是我做错了什么?
当您调用
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()]);
我在我的设置方法中调用了
actingAs()
,但需要使用不同的防护来进行我的一项测试。我在测试中需要做的就是:
Auth::logout();
$this->actingAs($admin, "admin");
关键是在函数调用中指定守卫,否则无法工作。