在两个rails4应用程序之间共享会话
我正在用设计创建一个应用程序。 有两个域名1)www.test.com和2)www.hello.com两个域指向同一个应用程序。 所以我想在两个应用程序之间共享session(current_user)。 用户将登录(1)并且应该访问域(2)。
请建议什么是最好的方式。
这里的基本问题是cookie的工作方式(当然会话取决于哪种方式)。 Cookie具有域属性,浏览器只发送域名与请求主机匹配的Cookie(域名开头的句点含义有点微妙)
此外,在设置cookie时,浏览器只接受作为当前域的父域并且不是公共域的域。 例如,如果您收到来自www.example.com
的回复,则可以为www.example.com
或example.com
设置cookie,但不能设置.com
(浏览器列出不应允许的域名)。
所有这一切都说,如果你的两个应用程序不共享一个共同的父级(就像你的情况一样),那么你就无法共享cookie,因此你无法共享一个rails会话。
有许多方法可以解决这个问题,一个简单的方法称为CAS (中央身份validation服务)协议。 这个的基本流程是
- 用户访问hello.com并尝试访问某些受保护资源(例如/ home
- 用户被重定向到
sso.example.com/service?=http://hello.com/home
- 像往常一样validation用户的身份:用户登录,从cookie等识别。
- sso服务生成一个票证(一个仲裁令牌)并将用户重定向到http://hello.com/home?ticket=ABC123
- hello.com上的应用程序将(服务器端)请求发送回SSO服务器,并传递票证
- SSO服务器响应指示票证是否有效。 如果票证有效,它还将包含有关用户的一些信息(例如电子邮件)
-
hello.com
设置会话cookie,以便后续请求可以跳过步骤2-6
cas的ruby实现(例如rubycas同时具有cas客户端和服务器)并设计使用CAS的策略 。 当然还有其他方法可以做到这一点,例如使用誓言,但CAS更简单一些。
我基本上在许多Amazon EC2实例上部署了相同的应用程序,所有应用程序服务器共享一个公共数据库。 因此,这允许我扩展。
所以我的答案是表单真实性令牌会自动负责维护会话,你不必担心。 它应该工作。
对于多个域,这可以解决问题
APP::Application.config.session_store :cookie_store, key: '_app_session', domain: :all
请注意,如果仅更改TLD,这将起作用。 例如: hello.com
和hello.org
。
参考文献:
https://github.com/rails/rails/commit/1091a6e9b700bd713c8a6818761a27aa72b1fe93
- Devise和Rails – Devise中的ArgumentError :: RegistrationsController #create
- 设计如何在创建用户表单中添加一个addtional字段?
- Rails 4 – 未定义的方法’authenticate’为nil:NilClass
- 如何使用devise和Rails 4设置用户身份validation?
- 设计模型确认后做自定义动作
- 如何使注册页面成为Devise的根页面?
- 使用多个“用户”模型获取Paper_trail + Rails_admin +设计
- 从Rails 3中的application.js访问current_user变量
- bcrypt错误:设计ruby 2.0和rails 4.0