2017-05-26 62 views
1

我在Rails API應用程序中有兩個warden策略,用於基本身份驗證和令牌身份驗證。守望者跳過策略

初始化/ 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馬斯它在第一後結束。它忽略了一種策略。爲什麼? PS:我不使用設計。我不使用設計。我不使用設計。我不使用設計。

回答

0

首先我會假設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!時,監督將停止運行策略。