首先,两个应用程序需要共享fos_user表,以便它们可以在何时重新加载用户。因为您有“一个应用程序和两个指向同一个应用程序的域”。这应该已经是正确的了。
接下来是设置要在域和子域之间共享的会话 cookie。您问题中的配置是正确的。但是,当您从 dev.site.com 更改为 poll.dev.site.com 时,为了让 FOSUserBundle 能够重新加载用户,您需要在两个域之间共享会话存储。
我可以建议的最简单的方法是将会话存储在数据库中。这是通过使用 Symfony 中可用的PdoSessionStorage来实现的。官方文档介绍了如何设置会话存储来做到这一点。
如果以上所有操作都正确,您应该无法登录到 dev.site.com 上的安全区域,然后将 URL 更改为 poll.dev.site.com 上的其他安全区域,而无需再次提供登录凭据。请注意,用户凭据仅加载在安全区域中。
当它可以直接在浏览器中打开 poll.dev.site.com 时,需要再次输入凭据。您需要做一些额外的工作才能使 Ajax 请求正常工作。
根据这两个问题:从 ajax 请求、多子域 cookie 和 ajax 问题在子域上设置 cookie 问题可能是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 但我没有测试。
如果在测试时将 Cookie 标头发送到服务器,我使用 Opera 的 Dragonfly 来检查网络流量。您也可以使用 Firebug、Chrome 或 IE。