【问题标题】:Wilcard subdomain based session on multi-tenant laravel application基于通配符子域的多租户 laravel 应用程序会话
【发布时间】:2014-11-18 22:27:15
【问题描述】:

我正在创建一个基于 laravel 的多租户电子商务应用程序。当用户创建商店时,他将获得一个子域。因此,为了满足应用程序的未来用户需求,我创建了一个通配符子域。

每个店主都有自己的产品/物品等,独立于其他人。我的问题是,我怎样才能只为那个特定的子域使用会话?举个例子,当一个人在mystore.site.com添加一个特定的项目时,我希望它只在那个商店,所以当他浏览其他商店时,他的购物车应该是空的,除非他回到mystore.site.com

这可能吗?因为当我打开session 时,它的会话 Cookie 路径位于根目录中,我认为它将应用于域范围。而且我只使用了 1 个 laravel 安装

【问题讨论】:

    标签: php session laravel


    【解决方案1】:

    真的有两种选择。

    首先,您可以在应用程序中挂钩启动过程的开始,并在运行时覆盖session.domain 配置选项。您基本上需要一个早期流程来识别当前子域的租户并像这样更改设置:

    Config::set('session.domain', $tenant->domain . '.site.com');
    

    此外,您可以使用获取租户的对象来设置请求的上下文(使用存储库模式更容易)。

    例如,第二个选项是在会话数据中包含实际域。

    Session::push('shopping_cart.' . $tenant->domain, $cart);
    

    如果您在会话中使用push 方法,它只会将内容附加到会话的特定部分,例如shopping_cart.mystore,因此您可以使用shopping_cart.mystoreshopping_cart.theirstore 和@987654328 @。然后你可以为Session 创建一个漂亮的小包装器,它会自动附加它,让你可以简单地调用Session::get('shopping_cart')

    您会注意到,上面我假设域字段仅包含子域的名称,减去实际域。

    【讨论】:

    • 我应该在哪里声明$tenant->domain
    • 假设$tenant是代表当前租户的模型实例。
    • 好的,谢谢。也许我应该选择第二个选项,因为它让我可以更灵活地做其他事情,只需致电 Session::get('shopping_cart' . $tenant->domain); 即可获得租户特定的会话。
    猜你喜欢
    • 2016-10-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2015-12-30
    相关资源
    最近更新 更多