4

场景:使用子域并设计的多租户 Rails 应用程序问题:我希望用户能够登录到 mydomain.com,然后作为登录用户转发到他们自己的 subdomain1.mydomain.com 地址。现在他们只能直接登录到他们自己的子域。

我是一个相对的 Rails 新手,我找不到一个简单的解决方案(尽管似乎必须有一个)。理想情况下,我希望 mydomain.com 和 subdomain1.mydomain.com 共享一个 cookie,但我的技能不适合编写自定义中间件。显然,由于它是多租户的,我无法在所有子域中共享一个会话。坚持了几天,并好奇是否有一个简单的解决方案(例如 config.session_store 域设置)在我开始查看 OAuth 或其他更繁琐的解决方案之前我缺少。任何帮助将不胜感激!

编辑:当然,我只是在发布后才发现这个。在注册 Rails 和 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_store 中设置为 :all 时,它会破坏范围。如果用户未被授权,它会通过 request.protocol(http:// 或 https://)+request.domain 重定向将他们重定向到公共主页。简单的!现在,用户可以在同一个会话中在基本域和他们的子域之间移动。

4

1 回答 1

2

曲奇饼

根据您发布的内容,我估计您在跟踪会话 cookie 时遇到了问题。我们的子域驱动的应用程序也遇到了类似的问题,这导致每次在两者之间切换时 cookie 都会被丢弃

我们在这里找到了补救措施: 在 Rails 中的子域之间共享会话(cookies)?

#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以反映它


转发

我不确定您的转发是否有问题;无论如何,我会给你一些想法。

当您登录到“子域”时,除非您拥有真正的 Rails 多租户实现(每个用户都存储在不同的数据库中),否则您应该能够允许用户登录主表单,并且然后将它们重定向到子域而不会出现问题

您需要考虑的是,仅当您使用路径助手时才会填充subdomain约束:_url

<%= link_to "Your Name", path_url(subdomain: "subdomain_1") %>

这样做的原因是_path帮助程序与基本 URL 相关,因此无法填充该subdomain选项。或者,_url路径帮助程序指向整个 URL - 允许您根据需要定义子域

--

如果您发送请求并继续希望用户保持登录状态,则需要确保您能够跨子域保持身份验证。IE 如果您在“主”页面上有一个单点登录表单,您需要确保您可以继续对子域进行身份验证

于 2014-08-01T08:04:05.517 回答