ruby-on-rails 跳过特定路由的http_basic_authentication_with

ubbxdtey  于 2022-12-24  发布在  Ruby
关注(0)|答案(2)|浏览(98)

在rails中,我有一个定义http_basic_authentication_with的基本控制器,我希望在子类中有一个特定的路由跳过它,这类似于我如何指定一个控制器skip_before_filter,这可能吗?
我的基本控制器看起来像这样:

class BaseController < ApplicationController
  http_basic_authenticate_with name: "name", password: "password"
end

我有一个控制器继承了它:

class HomeController < BaseController
   def index
   end

   def no_auth
   end
 end

我希望“index”需要基本的auth,而“no_auth”不需要。
谢谢!

lnvxswe2

lnvxswe21#

我会这么做。

class BaseController < ApplicationController
  http_basic_authenticate_with name: "name", password: "password"
end

让我们用我们自己的类方法替换http_basic_authenticate_with,我们称之为auth_setup

class BaseController < ApplicationController
  auth_setup

  def self.auth_setup
    http_basic_authenticate_with name: "name", password: "password"
  end
end

因为我们不想在每个子类中调用它,所以我们可以只提取其他方法的参数,我们称之为auth_params。

class BaseController < ApplicationController
  auth_setup

  def self.auth_setup
    http_basic_authenticate_with auth_params
  end

  def self.auth_params
    { name: 'name', password: 'password' }
  end
end

从现在开始,我们可以使用这个方法来修改我们子类中的auth参数,例如:

class HomeController < BaseController    
  def index
  end

  def no_auth
  end

  def self.auth_params
    (super).merge(except: :index)
  end
end

然而,Ruby类定义中的方法调用不是继承的(很容易忘记 * Rails风格的东西 *)。根据http_basic_authenticate_with的实现,您将需要另一个修复-inherited回调。

class BaseController < ApplicationController
  auth_setup

  def self.auth_setup
    http_basic_authenticate_with auth_params
  end

  def self.auth_params
   { name: 'name', password: 'password' }
  end

  def self.inherited(subclass)
    subclass.auth_setup
  end
end

希望能有所帮助!

qyswt5oh

qyswt5oh2#

class ApplicationController < ActionController::Base

  before_action :auth

  def auth
    pass = ENV['AUTH'].split ':'
    http_basic_authenticate_or_request_with name: pass[0], password: pass[1]
  end
class SomeController < ApplicationController

  skip_before_action :auth, only: [:ping]

相关问题