场景:多租户Rails应用程序,使用子域和devise
问题:我希望用户能够登录到mydomain.com,然后作为已登录用户被转发到他们自己的子域1.mydomain.com地址。现在他们只能直接登录到自己的子域。
我是一个相对新手的Rails开发者,我找不到简单的解决方案(尽管似乎必须有一个)。理想情况下,我希望mydomain.com和subdomain1.mydomain.com共享一个cookie,但我没有编写自定义中间件的技能。显然,由于它是多租户,我不能在所有子域之间共享一个会话。我困在这里几天了,好奇是否有一个简单的解决方案(例如config.session_store domain设置),我错过了什么,然后再开始看OAuth或其他更繁琐的解决方案。任何帮助都将不胜感激!
编辑:当然,在发布后我才发现这个Log a user into their subdomain after registration with Rails and Devise 。将尝试使用配置session_store domain:all和before filter建议,并在不起作用时发布任何详细信息,至少看起来像个好主意。
基本上,我在登录时使用session[:subdomain]设置子域,并使用它来将会话限定为当前用户。否则,当session_store中的域设置为:all时,它会破坏范围。如果用户未经授权,则通过request.protocol(http://或https://)+ request.domain重定向到公共主页。简单!现在用户可以在同一会话中在基础域和子域之间移动。
编辑:适用于我的特定带有子域名设置的Devise的解决方案:
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重定向到公共主页。简单!现在用户可以在同一会话中在基础域和子域之间移动。
before_filter
有什么用途? - Richard Peck