1

現在、監視員マネージャーでは、カスタムの失敗アプリが宣言されています。

    Rails.configuration.middleware.use Warden::Manager do |manager|
      manager.default_strategies :password
      manager.failure_app = lambda { |env| SessionsController.action(:new).call(env) }
    end

ただし、私の戦略の 1 つで、別の失敗アクションを使用したいので、失敗でカスタム アクションを次のように宣言しようとしました。

 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

Github ( https://github.com/hassox/warden/issues/73 )の Warden の問題に関する JonRowe によって提案されたアイデアで、解決策を見つけることができました。

ラムダを変更するという彼の提案により、ワーデンマネージャーの構成を次のように変更することができました。

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 に答える