【问题标题】:Devise ignore my custom strategy设计忽略我的自定义策略
【发布时间】:2012-08-17 16:55:29
【问题描述】:

我想创建一个自定义身份验证策略来访问 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

【问题讨论】:

    标签: ruby-on-rails devise warden


    【解决方案1】:

    找到答案了!

    我不得不使用这个:

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

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

    【讨论】:

      【解决方案2】:

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

      如果这不起作用,请不要害怕在设计本身中添加一些临时 puts 语句,其中调用身份验证以检查 default_strategies。也就是说,如果您对使用调试器不满意,我会这样做。

      【讨论】:

      • 我在设计初始化程序的顶部确实有这一行: require Rails.root.join('app/devise/strategies/api') 如果我在策略中添加一个 pry 调用,它在 rails 应用程序启动时加载。但是我在有效范围内的所有撬动电话?方法永远不会被调用。
      猜你喜欢
      • 2011-03-31
      • 2014-10-12
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2011-11-22
      • 2011-05-12
      相关资源
      最近更新 更多