场景:使用子域并设计的 Multi-Tenancy Rails 应用程序
问题:我希望用户能够登录到 mydomain.com 然后 转发至他们自己的 subdomain1.mydomain.com 地址作为登录用户。现在他们只能直接登录到他们自己的子域。
我是一个相对的 Rails 新手,我找不到一个简单的解决方案(尽管似乎必须有一个)。理想情况下,我希望 mydomain.com 和 subdomain1.mydomain.com 共享一个 cookie,但我的技能不适合编写自定义中间件。显然,由于它是 Multi-Tenancy 的,我无法在所有子域中共享一个 session 。坚持了几天,并好奇在我开始研究 OAuth 或其他更繁琐的解决方案之前是否有一个我缺少的简单解决方案(例如 config.session_store 域设置)。任何帮助将不胜感激!
编辑:当然,我只是在发布后才发现这个。 Log a user into their subdomain after registration with Rails and Devise .将尝试 config.session_store 域: :all 并在过滤器推荐之前发布任何详细信息,如果它不起作用,至少看起来是个好主意。
编辑:适用于我的特定设计的解决方案与子域设置:
class ApplicationController < ActionController::Base
before_action :check_subdomain
def check_subdomain
unless request.subdomain == "" or request.subdomain == session[:subdomain]
redirect_to request.protocol+request.domain
end
end
end
session_store.rb
My::Application.config.session_store :cookie_store, key: '_my_session' , :domain => :all, :tld_length => 2
基本上,我在登录时使用 session[:subdomain] 在 session 中设置子域,并使用它将 session 范围限定为当前用户。否则,当域在 session_store 中设置为 :all 时,它会破坏范围。如果用户未被授权,它会通过 request.protocol(http://或 https://)+request.domain 重定向将他们重定向到公共(public)主页。简单的!现在,用户可以在同一个 session 中在基本域和他们的子域之间移动。
最佳答案
cookies
根据您发布的内容,我估计您在跟踪 session cookie 时遇到了问题。我们的子域驱动的应用程序也遇到了类似的问题,这导致每次在两者之间切换时 cookie 都会被丢弃
我们在这里找到了补救措施:
Share session (cookies) between subdomains in Rails?
#config/initializers/session_store.rb
Your_App::Application.config.session_store :cookie_store, key: '_your_app_session', domain: :all, tld_length: 2
诀窍是
tld_length
参数 - 这允许您定义可以容纳多少个域的“级别”; IE 如果您使用的是子域,则需要设置 tld_length
反射(reflect)它转发
我不确定您的转发是否有问题;无论如何,我会给你一些想法。
当您登录到“子域”时,除非您拥有真正的 Rails Multi-Tenancy 实现(每个用户都存储在不同的数据库中),否则您应该能够允许用户登录主表单,并且然后将它们重定向到子域而不会出现问题
您需要考虑的是
subdomain
约束 仅当您使用 _url
时才会填充路径助手:<%= link_to "Your Name", path_url(subdomain: "subdomain_1") %>
原因是
_path
helper 与基本 URL 相关,因此无法填充 subdomain
选项。或者,_url
path helper 指向完整的 URL - 允许您根据需要定义子域--
如果您发送请求并继续希望用户保持登录状态,则需要确保您能够跨子域保持身份验证。 IE 如果您在“主”页面上有一个单点登录表单,您需要确保您可以继续对子域进行身份验证
关于ruby-on-rails - 带有子域登录管理的 Rails 4 Multi-Tenancy ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25074646/