我在具有多个子域的rails应用程序中使用devise gem。每个子域由相应的控制器处理,如下所示:
class Subdomain1Controller < ApplicationController
before_filter :authenticate_user!
def index
end
end
通过上述控制器实现,Devise在将用户重定向到登录页面时始终保持子域名。在上述情况下,Devise将用户重定向到http://subdomain1.acmesite/users/sign_in,而不是公共sign_in Url。
这导致每个子域都有多个sign_in url。
http://subdomain1.acmesite/users/sign_in
http://subdomain2.acmesite/users/sign_in
http://subdomain3.acmesite/users/sign_in
我想知道是否可以覆盖设计方法以从网址中排除子域部分并保留上一页网址的信息。更珍贵的是,我希望Devise将用户重定向到特定的Url(如:http://acmesite/users/sign_in)而不考虑子域,并且在成功验证后,Devise应该将用户返回到调用者子域+页面。
答案 0 :(得分:2)
您需要编写一个自定义的FailureApp,在用户未经身份验证时启动。
来自How To: Redirect to a specific page when the user can not be authenticated
class CustomFailure < Devise::FailureApp
def redirect_url
#return super unless [:worker, :employer, :user].include?(scope) #make it specific to a scope
new_user_session_url(:subdomain => 'secure')
end
# You need to override respond to eliminate recall
def respond
if http_auth?
http_auth
else
redirect
end
end
end
在config / initializers / devise.rb中添加以下内容:
config.warden do |manager|
manager.failure_app = CustomFailure
end
如果您收到未初始化的常量CustomFailure错误,并且已将CustomFailure类放在/ lib目录下,请确保在application.rb文件中自动加载您的lib文件,如下所示
config.autoload_paths += %W(#{config.root}/lib)
答案 1 :(得分:-2)
我从我的项目中删除了Devise gem,现在使用了Sorcery。
法术为我提供了对控制器和视图的完全控制,完全符合我的项目要求。在这次过渡后,我有六个月的生产时间,我对Sorcery宝石很满意。