Laravel 11测试中排除加密的Cookie仍被加密的问题排查
我在开发Laravel 11项目时,已将Cookie「pattr」加入EncryptCookies中间件的$except数组以排除加密,但测试中通过withCookie设置该Cookie后,控制器中获取到的仍是加密值,即使禁用中间件问题依旧。
相关代码
EncryptCookies中间件代码
class EncryptCookies extends Middleware { /** * The names of the cookies that should not be encrypted. * * @var array<int, string> */ protected $except = [ 'pattr', ]; }
测试代码
public function test_repeat_guest_can_store_an_attribution(): void { $pattr = uniqid(); $response = $this->withCookie('pattr', $pattr) ->withoutExceptionHandling() ->post('api/attributions', [ 'utm_source' => 'Facebook', ]); }
控制器代码
$cookie_id = uniqid(); if ($request->hasCookie('pattr')) { $cookie_id = $request->cookie('pattr'); dd($cookie_id); }
获取到的加密Cookie示例
"EXAMPLE6Im1sRFdhSHdMdGhCZkFUU01pY0FMSUE9PSIsInZEXAMPLEjoiQlhkWENUWW1lZ25Vckt1QnhEWWZXTjN6TzRIS011EXAMPLEMTk9RR3ZjaTRDdVNFTEXAMPLEad0toVEcrdzhDQkpHd3Q2cmE0Rk9jZ0tMQWcvdXg0d1E9PSIsIm1hYyI6IjY5ZTFmMmEyNTYwNDczNEXAMPLEkYTA3OGFlODI0ZTkxZDU5YmRiNjQ2ZjVjMTRjMWJkMGZkN2MxYjQzOTEzOTMiLCJ0YWcEXAMPLE=="
原因分析
- Laravel测试中的
withCookie方法默认会自动加密Cookie值,该逻辑独立于EncryptCookies中间件的$except配置,因为它是在请求发送前直接处理Cookie,不走中间件的加密判断流程。 - 即使禁用
EncryptCookies中间件,withCookie自身的加密逻辑依然会生效,因此控制器仍会拿到加密后的Cookie值。
解决方法
方法一:使用withUnencryptedCookie(推荐)
Laravel 10.30及以上版本(包含Laravel 11)提供了withUnencryptedCookie方法,可直接设置未加密的Cookie值,跳过自动加密:
public function test_repeat_guest_can_store_an_attribution(): void { $pattr = uniqid(); $response = $this->withUnencryptedCookie('pattr', $pattr) ->withoutExceptionHandling() ->post('api/attributions', [ 'utm_source' => 'Facebook', ]); }
方法二:手动加密后传入(旧版本兼容)
如果使用的是低于10.30的Laravel版本,可手动加密Cookie值后再传入withCookie(注意关闭序列化,避免双重处理):
public function test_repeat_guest_can_store_an_attribution(): void { $pattr = uniqid(); $encryptedPattr = app('encrypter')->encrypt($pattr, false); $response = $this->withCookie('pattr', $encryptedPattr) ->withoutExceptionHandling() ->post('api/attributions', [ 'utm_source' => 'Facebook', ]); }
额外验证
确认EncryptCookies中间件已在全局中间件栈中正确注册,且$except数组中的Cookie名称无拼写错误(Cookie名称大小写敏感)。
内容的提问来源于stack exchange,提问作者alexmcfarlane
相关产品推荐
相关产品推荐

