代码之家  ›  专栏  ›  技术社区  ›  Eugene Yak

Ruby on Rails:我可以在约束中使用http基本身份验证吗?

  •  5
  • Eugene Yak  · 技术社区  · 6 年前

    我使用Rails 5 API模式

    路线。rb:

    Rails.application.routes.draw do      
      constraints Basic do
        mount Rswag::Ui::Engine  => '/api-docs'
        mount Rswag::Api::Engine => '/api-docs'
        mount Sidekiq::Web       => '/sidekiq'
        # etc
      end
    end
    

    约束条件/基本条件。rb:

    class Basic
      def self.matches?(request)
        authenticate_or_request_with_http_basic do |email, password|
          email == 'foo' && password = 'bar'
        end
      end
    end
    

    但我有个错误:

    NoMethodError(对于basic:Class,未定义方法“authenticate\u or\u request\u with\u http\u basic”)

    我可以在约束中使用http基本身份验证吗?

    1 回复  |  直到 5 年前
        1
  •  3
  •   Martin    6 年前

    我想你不能用 authenticate_or_request_with_http_basic 方法超出控制器范围。您可以设置 before_filter 在通用控制器中进行身份验证检查。以下是以下示例 docs comments :

    class AdminController < ApplicationController
      before_filter :authenticate
    
      def authenticate
        authenticate_or_request_with_http_basic('Administration') do |email, password|
          email == 'foo' && password == 'bar'
        end
      end
    end
    

    这是我发现的 Rails Authentication Routing Constraints Considered Harmful


    尽管如此,我认为有一种方法:

    class Basic
      def self.matches?(request)
        if ActionController::HttpAuthentication::Basic.has_basic_credentials?(request)
          credentials = ActionController::HttpAuthentication::Basic.decode_credentials(request)
          email, password = credentials.split(':')
    
          email == 'foo' && password == 'bar'
        end
      end
    end
    

    Here is docs on HTTP Basic authentication 举例说明