6

我想创建一个自定义身份验证策略来访问 API。我遵循了Devise ignoring custom strategy的示例代码。

问题是有效吗?我的 Api 策略中的方法永远不会运行(基于试图撬开它)。

我的代码:

module Devise
  module Strategies
    class Api < Devise::Strategies::Base
      def valid?
        binding.pry
        params[:request_source] == 'api'
      end

      def authenticate!
        #do stuff here

        if user
          success!(user)
        else
          warden.custom_failure!
          render :json=> {:success=>false, :message=>"Error with your login or password"}, :status=>401
        end
      end
    end

    Warden::Strategies.add(:api, Devise::Strategies::Api)

  end
end

并在设计初始化程序中:

config.warden do |manager|
  manager.default_strategies.unshift :api
end

无论我做什么,Devise 似乎总是使用它的默认策略。AFAIK,这应该足够了......

- - - -编辑 - - - -

我需要在我的设计初始化程序的最顶部使用这样的策略:

require Rails.root.join('app/devise/strategies/api')

我知道该策略是在启动时加载的,因为如果我在类中进行 pry 调用,它将启动一个 pry 会话。但是方法中的 Pry 调用永远不会运行。:-S

4

2 回答 2

4

找到了答案!

我不得不使用这个:

config.warden do |manager|
  manager.default_strategies(scope: :user).unshift :api
end

让它工作。奇怪的是,我在网上看到的很多示例代码都没有使用它:-S

于 2012-08-22T16:34:30.523 回答
0

您何时需要自定义策略?与示例相比,您在此处添加策略,而不是在初始化程序中。您可以尝试在初始化程序顶部要求自定义策略,以确保在将其添加到 default_strategies 之前已加载它。

如果这不能解决问题,请不要害怕在设计本身中添加一些临时的 puts 语句,其中调用 authenticate 来检查 default_strategies。也就是说,如果您对使用调试器不满意,我会这样做。

于 2012-08-21T23:05:54.827 回答