我的监狱长经理当前宣布了一个自定义失败的应用程序。
Rails.configuration.middleware.use Warden::Manager do |manager|
manager.default_strategies :password
manager.failure_app = lambda { |env| SessionsController.action(:new).call(env) }
end
但是,对于我的一个策略,我想使用不同的失败操作,所以我尝试在失败中声明自定义操作:
def authenticate!
email = params["email"] || params['session']['email']
pw = params["password"] || params['session']['password']
user = User.find_by_email email
if user && user.authenticate_and_activated(pw)
success! user
else
throw(:warden, :stuff => "foo", :action => :failure)
end
end
甚至在我的控制器动作中:
def sign_in
@user = warden.authenticate! :action => :failure
...
end
这是我的失败行动:
def failure
warden.custom_failure!
render :json => {:success => false, :errors => ["Login Failed"]}
end
但问题是它似乎忽略了它,只调用我经理中宣布的行动。任何人都知道我可能做错了什么?
答案 0 :(得分:2)
我能够通过JonRowe关于Github上Warden问题的建议找出我的解决方案(https://github.com/hassox/warden/issues/73)
根据他改变我的lambda的建议,我能够将我的看守经理配置更改为:
Rails.configuration.middleware.use Warden::Manager do |manager|
manager.default_strategies :password
manager.failure_app = lambda { |env|
failure_action = env["warden.options"][:action].to_sym
SessionsController.action(failure_action).call(env)
}
end
这引起了我传递给它的失败行为。它似乎存储在行动中的“warden.options”哈希中。