在symfony 2.1中共享域和子域之间的身份验证

时间:2012-12-12 15:39:24

标签: session subdomain symfony-2.1 fosuserbundle

在一个应用程序中,我使用长轮询实现了一个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

1 个答案:

答案 0 :(得分:2)

首先,两个应用程序需要共享 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 requestmulti-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。