【问题标题】:Warden skips strategy典狱长跳过策略
【发布时间】:2017-05-26 23:41:26
【问题描述】:

我在 Rails API 应用程序中有两种守望者策略,用于基本身份验证和令牌身份验证。

initializers/warden.rb

Warden::Strategies.add(:auth_token, AuthTokenStrategy)
Warden::Strategies.add(:basic_auth, BasicAuthStrategy)

config/application.rb

config.middleware.insert_after ActionDispatch::Callbacks, Warden::Manager do |manager|
  manager.default_strategies :auth_token, :basic_auth
  manager.failure_app = UnauthorizedController
end

这两种策略都实现了#valid?

class BasicAuthStrategy < ::Warden::Strategies::Base
  def valid?
    auth.provided? && auth.basic?
  end
  ...
end

class AuthTokenStrategy < ::Warden::Strategies::Base
  def valid?
    auth.provided? && !auth.basic? && headers['HTTP_AUTHORIZATION'].start_with?('Bearear')
  end
  ...
end

我想用令牌发出请求,守望者尝试 BasicAuthStrategy 然后它尝试 AuthTokenStrategy mas,它在第一个之后结束。它忽略了一种策略。为什么?

PS:我没有使用设计。

【问题讨论】:

    标签: ruby-on-rails ruby warden


    【解决方案1】:

    首先,我假设 auth.provided?auth.basic? 已定义并正常工作。您提供的示例没有显示authenticate! 方法的外观,因此我将输入一些伪代码。

    class AuthTokenStrategy < ::Warden::Strategies::Base
      def valid?
        request.headers['HTTP_AUTHORIZATION'].start_with?('Bearear')
      end
    
      def authenticate!
        bearer_token = request.headers['HTTP_AUTHORIZATION'].split(' ')
        if user = User.find_by(bearer_token: auth_token)
          success!(user)
        end
      end
    end
    
    class BasicAuthStrategy < ::Warden::Strategies::Base
      def valid?
        not request.headers['HTTP_AUTHORIZATION'].nil?
      end
    
      def authenticate!
        auth_token = request.headers['HTTP_AUTHORIZATION']
        if user = User.find_by(auth_token: auth_token)
          success!(user)
        end
      end
    end
    
    Warden::Strategies.add(:auth_token, AuthTokenStrategy)
    Warden::Strategies.add(:basic_auth, BasicAuthStrategy)
    
    Rails.application.config.middleware.use Warden::Manager do |manager|
      manager.default_strategies %i[auth_token basic_auth]
      # manager.failure_app = lambda { |env|
      #  SessionsController.action(:failure).call(env)
      #}
    end
    

    值得注意的是,在您的情况下,valid? 定义可能是可选的。当有人返回success!时,Warden 将停止运行策略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 2011-05-26
      • 2017-09-05
      • 1970-01-01
      相关资源
      最近更新 更多