不使用Authenticatable用户模型时如何实现Laravel认证测试
Laravel自定义认证场景下的测试会话实现方案
完全可以在测试流程中使用认证后生成的laravel_session cookie发起后续请求,不需要手动拼接请求头传递cookie,Laravel测试客户端自带会话持久化能力,适配自研认证逻辑的测试实现步骤如下:
模拟完整认证流程,自动留存会话cookie
你不需要改造现有自研认证逻辑,直接在测试方法中模拟用户真实的认证请求链路即可,测试客户端会自动留存整个请求过程中服务端返回的所有cookie,包括laravel_session。参考实现代码:public function test_auth_and_admin_access() { // 提交JSON格式的邮箱、密码认证参数 $authResponse = $this->postJson('/your/custom/login/route', [ 'email' => 'test_account@example.com', 'password' => 'test_account_password', ]); // 断言认证流程返回符合预期:重定向到认证页面 $authResponse->assertRedirect('/your/auth/verify/page'); // 跟进重定向请求,走完完整认证流程,过程中生成的laravel_session会被自动保存 $this->followRedirects($authResponse); }后续请求自动携带认证态,无需手动处理cookie
同一个测试方法内,完成认证流程后直接发起后台面板的相关请求即可,测试客户端会自动把之前留存的laravel_sessioncookie附加到请求中,和浏览器真实访问的行为完全一致,不需要手动提取cookie、也不需要手动往请求头塞参数:// 直接访问后台页面/接口,自动携带认证会话 $adminPageResponse = $this->get('/admin/dashboard'); // 断言可以正常访问后台,不会被认证拦截 $adminPageResponse->assertStatus(200);特殊场景下手动获取、传递cookie的方法
如果你有特殊测试需求需要手动拿到laravel_session的具体值,可以在走完完整认证流程后直接从测试客户端的cookie容器中获取,传递时调用框架提供的withCookie方法即可,不需要手动构造请求头:// 获取认证生成的session cookie $sessionCookie = $this->getCookieByName('laravel_session'); // 手动附加cookie发起特殊请求 $customRequestResponse = $this->withCookie( $sessionCookie->getName(), $sessionCookie->getValue() )->get('/your/special/custom/route');
注意:不要尝试手动将cookie拼接进请求头传递,这种方式会绕开Laravel自带的会话、cookie解析逻辑,大概率会导致认证校验失败,直接使用测试客户端提供的cookie相关方法即可。
内容的提问来源于stack exchange,提问作者Mehmet KÖSMEN
相关产品推荐
相关产品推荐

