声明自定义失败操作以使监听器无法正常工作

时间:2013-03-20 22:00:44

标签: ruby-on-rails warden

我的监狱长经理当前宣布了一个自定义失败的应用程序。

    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

但问题是它似乎忽略了它,只调用我经理中宣布的行动。任何人都知道我可能做错了什么?

1 个答案:

答案 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”哈希中。