我在Rails 3应用程序中使用Devise进行身份验证.该应用程序使用Postgresql模式和Apartment gem来促进多租户.
在创建帐户后,登录和退出特定子域正在运行良好.用户只能在子域登录其特定帐户,这是非常好的.
这里是我遇到的问题…
http://foo.com/signup
默认情况下,当他们单击提交时,新帐户被创建,但是用户被发送到:
http://foo.com/dashboard
相反,我希望他们去:
http://myaccount.foo.com/dashboard
为了实现这一点,我在我的registrations_controller.rb文件中覆盖了after_sign_up_path_for方法:
def after_sign_up_path_for(resource) root_url(:subdomain => resource.account.subdomain) end
这是按照预期工作的 – 它加载正确的URL – 但是为根域(foo.com)而不是子域创建了用户的会话,因此要求用户登录.
我发现一个建议是将config / initializers / session_store.rb更改为:
config.session_store :cookie_store,:key => '_domain_session',:domain => :all
但是这允许任何人登录到任何子域上的帐户,这显然不是很酷.
解决方法
你可以在你的config.session_store中使用domain::all选项,只要有一个before_action就像注释中的一些.
所以你仍然可以在config / initializers / session_store.rb或config / application.rb中的代码:
config.session_store :cookie_store,:domain => :all
然后在你的application_controller中添加以下代码:
#app/controllers/application_controller.rb before_action :check_subdomain def check_subdomain unless request.subdomain == current_user.account.subdomain redirect_to root_path,alert: "You are not authorized to access that subdomain." end end