Laravel在域和子域中共享cookie检测问题

Mis*_*aGH 20 cookies laravel

我正在研究Laravel 5.4.30.

想象一下,我们有一个域example.com和一个子域dev.example.com.主域用于主分支,dev子域用于develop分支.我们有cookie通知系统,点击Hide Cookie Notice按钮后会隐藏.这通过永久设置cookie来实现.我们SESSION_DOMAIN为每个环境设置了每个域的配置.

对于主域名:

SESSION_DOMAIN=example.com
Run Code Online (Sandbox Code Playgroud)

对于dev子域:

SESSION_DOMAIN=dev.example.com
Run Code Online (Sandbox Code Playgroud)

现在问题来自这里.如果我们转到example.com并点击隐藏cookie通知,将为主域永久设置cookie.之后我们去做dev.example.com并做同样的事情.因此,也会为子域设置cookie.但是这个cookie已经在前一个之后设置了.(顺序很重要)现在,如果我们刷新子域,我们将再次看到通知!(未隐藏)由于浏览器中的cookie 参数.example.com设置,浏览器已读取主cookie domain,因此每个子域都会受到影响.但该视图仍然显示通知,因为它无法读取任何cookie以进行隐藏.

无论如何,我不想在所有子域中共享该cookie.我怎样才能做到这一点?我想我应该为cookie名称添加一个前缀.但我不知道怎么做,laravel会自动为cookie名称添加前缀.

有解决方案吗

Kys*_*lik 7

您需要实现自己的"检索"和"设置"cookie.

检索(有,获取)cookie

使用名称Cookie 创建自己的新类(您喜欢的任何地方,但我会使用app/Foundation/Facades /).

use \Illuminate\Support\Facades\Cookie as CookieStock;

class Cookie extends CookieStock { 
    //implement your own has(...);
    public static function has($key)
    {
        return ! is_null(static::$app['request']->cookie(PREFIX . $key, null)); //get the prefix from .env file for your case APP_ENV
    }

    //implement your own get(...);
    public static function get($key = null, $default = null) {...}
}
Run Code Online (Sandbox Code Playgroud)

现在打开config/app.php并更改相应的别名(cookie).

设置(制作)cookie

创建自己的新提供者(使用工匠),并从Illuminate\Cookie\CookieServiceProvider.php复制粘贴代码并更改名称空间.再次打开config/app.php并使用新的服务提供商更改相应的服务提供商.

使用名称CookieJar 创建自己的新类(您喜欢的任何地方,但我会使用app/Foundation/Cookie /).

use \Illuminate\Cookie\CookieJar as CookieJarStock;

class CookieJar extends CookieJarStock {

//Override any method you think is relevant (my guess is make(), I am not sure at the moment about queue related methods)

    public function make($name, $value, $minutes = 0, $path = null, $domain = null, $secure = false, $httpOnly = true)
    {
        // check before applying the PREFIX
        if (!empty($name)) {
            $name = PREFIX . $name; // get the PREFIX same way as before
        }

        return parent::make($name, $value, $minutes, $path, $domain, $secure, $httpOnly);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新您自己的cookie服务提供程序中的代码以使用您的CookieJar实现(第19行).

$ composer dump-autoload,你应该完成.

更新

自BorisD.Teoharov提出以来,如果框架在主要版本之间更改CookieJarStocks make()(或任何其他cookie相关函数)的签名,我创建了一个示例存储库,其中包括可以按原样使用的测试,如果签名将会失败变化发生了.

这很简单:

public function test_custom_cookie_jar_can_be_resolved()
{
    resolve(\App\Foundation\Cookie\CookieJar::class);
    $this->assertTrue(true);
}
Run Code Online (Sandbox Code Playgroud)

详细介绍了如何在相应的commit diff中进行检查.