1

目前在我的监狱长经理中,我们声明了一个自定义故障应用程序。

    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

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

4

1 回答 1

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

于 2013-03-24T22:24:27.857 回答