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

标签 laravel cookies

我正在使用Laravel 5.4.30。

想象一下,我们有一个域example.com和一个子域dev.example.com。主域用于主分支,而开发子域用于开发分支。我们有cookie通知系统,单击Hide Cookie Notice按钮后将被隐藏。这可以通过永久设置Cookie来实现。
我们已经为每种环境的每个域设置了SESSION_DOMAIN配置。

对于主域:

SESSION_DOMAIN=example.com

对于开发子域:
SESSION_DOMAIN=dev.example.com

现在问题出在这里。如果我们转到example.com并单击隐藏cookie通知,则将永久设置主域的cookie。之后,我们转到dev.example.com并执行相同的操作。因此,也会为子域设置一个cookie。但是此cookie已在上一个cookie之后设置。 (顺序很重要)
现在,如果刷新子域,我们将再次看到该通知! (未隐藏)由于浏览器中cookie的.example.com参数中设置的domain,浏览器已读取主cookie,因此每个子域都将受到影响。但是 View 仍然显示该通知,因为它无法读取任何cookie以进行隐藏。

无论如何,我不想在所有子域之间共享该Cookie。我该如何实现?我想我应该为cookie名称添加一个前缀。但是我不知道该怎么做,laravel会自动在cookie名称中添加前缀。

有什么办法吗?

最佳答案

您需要实现自己的“检索”和“设置” 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) {...}
}

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

设置(制作)cookie

创建自己的新提供程序(使用artisan),然后从 Illuminate \ Cookie \ CookieServiceProvider.php 复制粘贴代码并更改 namespace 。
再次打开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);
    }
}

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

运行$ composer dump-autoload,您应该已完成。

更新资料

自从BorisD.Teoharov提出以后,如果框架在主要版本之间更改了CookieJarStockmake()(或任何其他与Cookie相关的函数)的签名,我将创建一个示例repository,其中包括一个可以按原样使用的测试,它将失败如果发生签名更改。

就这么简单:
public function test_custom_cookie_jar_can_be_resolved()
{
    resolve(\App\Foundation\Cookie\CookieJar::class);
    $this->assertTrue(true);
}

详细信息如何在the corresponding commit diff中进行检查。

关于laravel - Laravel在域和子域中共享cookie检测问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45759986/

相关文章:

php - 如何在浏览器关闭时删除 session cookie

javascript - 如何在 AngularJS 中存储用户 session ?

php - Laravel 5 - ORM has() 关系(反向 - notHas)

Laravel 使用 Socket.io 广播到私有(private) channel

laravel - 使用 Laravel 5 检查 "other"用户是否登录/注销

java - Liferay:如何从 portlet 添加 cookie

javascript - 尝试使用 js-cookies 设置表单输入值

php - 如何在 Laravel 中实现数组类型的路由?

php - MySQL 在 PHP 上使用外键显示结果

C# HttpWebRequest CookieContainer/Collection 在对象实例之间持久存在?