You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 11测试中排除加密的Cookie仍被加密的问题排查

问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:40:21