Laravel Sail环境下Laravel Dusk会话丢失问题求助
以下是你遇到的loginAs后auth()->user()返回null、受保护页面跳转登录页的可能原因及解决办法:
测试进程与Dusk浏览器进程的上下文隔离
$browser->loginAs()是在Dusk控制的浏览器实例中完成登录,而auth()->user()是在当前PHP测试进程中调用——这两个是完全独立的进程,测试进程无法直接读取浏览器的会话状态。你应该在浏览器操作中验证登录状态,比如访问受保护页面后断言页面内容,而不是在测试代码里直接调用auth()->user()。SESSION_DOMAIN 配置不匹配
Sail环境下,浏览器访问的域名(如localhost或自定义域名)可能与会话Cookie的Domain属性不匹配,导致Cookie无法被正确识别。可以在.env.dusk.local中设置SESSION_DOMAIN=localhost(或你实际访问的域名),确保Cookie的Domain与请求域名一致。Dusk环境的APP_KEY 与主项目不一致
Dusk使用单独的.env.dusk.local配置文件,如果其中的APP_KEY和主项目.env中的APP_KEY不同,会导致Laravel无法解密浏览器发送的会话Cookie,进而丢失登录状态。复制主项目的APP_KEY到.env.dusk.local中即可解决。会话驱动配置问题
测试环境默认使用array会话驱动,但该驱动是内存级别的,每个请求都会重置会话数据。Dusk测试需要持久化的会话驱动(如file或database),可以在.env.dusk.local中设置SESSION_DRIVER=file,确保跨请求的会话能被保留。认证守卫未指定或配置错误
如果你的项目自定义了认证守卫,loginAs()默认使用web守卫可能不生效。可以显式指定守卫:$browser->loginAs(User::find(1), 'web'); // 替换为你的实际守卫名称同时确认
config/auth.php中defaults.guard设置为web,且guards.web的配置正确。
内容的提问来源于stack exchange,提问作者TJ is too short

