ruby-on-rails - 带有子域登录管理的 Rails 4 Multi-Tenancy

标签 ruby-on-rails cookies devise multi-tenant rack-middleware

场景:使用子域并设计的 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/

相关文章:

ruby-on-rails - ActiveAdmin 操作

javascript - JS 前端更新 View {不工作}?

c# - 无法在 asp.net mvc 中更新 cookie

ruby-on-rails - 如何使用 Devise 中的 delete 方法进行注销? rails 路由失败(执行 get)

ruby-on-rails - session cookie问题: undefined method `each_with_object' Upgrading to Rails 4 and Ruby 2

ruby-on-rails - 自定义 will_paginate 渲染器

ruby-on-rails - Authlogic 密码的安全性如何?

Ruby Mechanize 不通过请求传递 cookie

javascript - 使用 js 从 Bootstrap 模式获取 cookie 的值

ruby-on-rails - 使用设计跳过 omniauth 用户的电子邮件确认