【问题标题】:share authentication between domain and subdomain in symfony 2.1在 symfony 2.1 中的域和子域之间共享身份验证
【发布时间】:2012-12-12 15:39:24
【问题描述】:

在一个应用程序中,我实现了一个带有长轮询的 javascript 聊天。由于每个域只允许一个 Ajax 请求,因此我想将轮询请求移至子域。

所以我有两个域:

dev.site.com
poll.dev.site.com

在我的config.yml 中,我输入了以下内容:

framework:
    session:
        domain: .dev.site.com
        cookie_domain: .dev.site.com

但是如果我尝试通过 Ajax 轮询子域,Symfony 不会让我保持登录状态。

关于如何将会话保持在子域上的任何想法? 我正在使用 FOSUserBundle

【问题讨论】:

  • 不能选择使用 .site.com?
  • 不是,因为应用程序主域是dev.site.comsite.com 是另一个应用程序的主页。

标签: session subdomain symfony-2.1 fosuserbundle


【解决方案1】:

首先,两个应用程序需要共享 fos_user 表,以便它们可以在何时重新加载用户。因为您有“一个应用程序和两个指向同一个应用程序的域”。这应该已经是正确的了。

接下来是设置要在域和子域之间共享的会话 cookie。您问题中的配置是正确的。但是,当您从 dev.site.com 更改为 poll.dev.site.com 时,为了让 FOSUserBundle 能够重新加载用户,您需要在两个域之间共享会话存储。

我可以建议的最简单的方法是将会话存储在数据库中。这是通过使用 Symfony 中提供的 PdoSessionStorage 来实现的。官方文档介绍了如何通过setup the session storage 做到这一点。

如果以上所有操作都正确,您应该无法登录到 dev.site.com 上的安全区域,然后将 URL 更改为 poll.dev.site.com 上的其他安全区域,而无需提供登录凭据再次。请注意,用户凭据仅加载在安全区域中。

当它可以直接在浏览器中打开 poll.dev.site.com 时,需要再次输入凭据。您需要做一些额外的工作才能使 Ajax 请求正常工作。

根据这两个问题:Setting a cookie on a subdomain from an ajax request,multi-sub-domain cookies and ajax problems问题很可能是http://en.wikipedia.org/wiki/Same_origin_policy

第一个建议在 dev.site.com 上设置以下标头字段:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://poll.dev.site.com

然后在 ajax 请求上传递 withCredentials

$.ajax({
    url: 'http://poll.dev.site.com/some/ajax/endpoint.json',
    xhrFields: { 
        withCredentials: true 
    }
});

我已经使用一个虚拟文件对其进行了测试,该文件只会设置 cookie 并尝试和 ajax 请求。如果我在 ajax 请求上有 withCredentials,我就能让它工作,但是当我尝试使用/不使用 Access-Control-Allow-* 标头时,我看不出任何区别。

另一个答案建议使用 document.domain 但我没有测试。

我使用 Opera 的 Dragonfly 来检查网络流量,如果在测试时将 Cookie 标头发送到服务器。您也可以使用 Firebug、Chrome 或 IE。

【讨论】:

  • 不行,即使我直接在浏览器中打开,我也没有登录。这是基本问题。
  • 两个应用程序之间是否共享会话存储和用户数据库。见stackoverflow.com/a/13258965/2094837
  • 我没有两个应用程序。我有一个应用程序和两个域指向同一个应用程序。
  • 因为它是同一个应用程序,如果 FOSUserBundle 可以加载会话,它应该能够在 poll.dev.site.com 上重新加载用户。默认情况下,Symfony 将会话存储在 app/cache/{env}/sessions 中。因此,如果两个域托管在具有相同 DocumentRoot 的同一台服务器上,那么 poll.dev.site.com 应该能够加载 dev.site.com 创建的会话文件,因为它们共享文件夹。
  • 是的,我知道。但事实并非如此,这就是问题所在。
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多