我正在使用设计创建一个应用程序。有两个域名1)www.test.com和2)www.hello.com这两个域都指向同一个应用程序。所以我想在两个应用程序之间共享session(current_user)。用户将登录(1)并且应该访问域(2)。
请建议最好的方式。
答案 0 :(得分:7)
这里的基本问题是cookie的工作方式(当然会话取决于哪种方式)。 Cookie具有域属性,浏览器只发送域名与请求主机匹配的Cookie(域名开头的句点含义有点微妙)
此外,在设置cookie时,浏览器只接受作为当前域的父域且不是公共域的域。例如,如果您收到来自www.example.com
的回复,则可以为www.example.com
或example.com
设置Cookie,但不能为.com
设置Cookie(浏览器的域名为list不应该允许姓名。)
所有这一切都表明,如果您的两个应用程序不共享一个共同的父级(就像您的情况一样),那么您就无法共享cookie,因此您无法共享一个rails会话。
有很多方法可以解决这个问题,一个简单的方法称为CAS(中央身份验证服务)协议。这个基本流程是
sso.example.com/service?=http://hello.com/home
hello.com
设置会话Cookie,以便后续请求可以跳过步骤2-6 有cas的ruby实现(例如rubycas同时具有cas客户端和服务器)并设计使用CAS的strategies。当然还有其他方法可以做到这一点,例如使用誓言,但CAS更简单。
答案 1 :(得分:1)
我基本上在许多Amazon EC2实例上部署了相同的应用程序,所有应用程序服务器共享一个公共数据库。因此,这允许我缩放。
所以我的答案是表单真实性令牌会自动负责维护会话,你不必担心。它应该工作。
<input name="authenticity_token" type="hidden" value="m5UtZ7GHPOnPaL4i0U24fzbmuSRWU76daZQaDjkHHE=">
对于多个域,这可以解决问题
APP::Application.config.session_store :cookie_store,
key: '_app_session',
domain: :all
注意,只有TLD更改才会有效。例如:hello.com
&amp; hello.org
。
参考文献:
https://github.com/rails/rails/commit/1091a6e9b700bd713c8a6818761a27aa72b1fe93