【问题标题】:How can I get a rails mounted engine to inherit http auth from an ActionController?如何让安装在导轨上的引擎从 ActionController 继承 http auth?
【发布时间】:2026-01-10 00:40:02
【问题描述】:

有没有办法让一个挂载的引擎从一个强制执行 http auth 的应用程序控制器继承?例如,我将pg-hero 安装在我的“admin”命名空间下(因此可以通过/admin/pghero 访问它);但是,我希望在通过其路由 URL 访问时应用“基本身份验证”。

我正在使用最新的稳定版 Rails 4.1.5。

routes.rb

  namespace :admin do
    get "/" => "clients#index" #define root for /admin
    resources :clients, except: [:new, :create, :destroy] do
      member do
        patch 'update_status'
      end
    end

    # mount pg hero under admin namespace
    mount PgHero::Engine, at: "pghero"
  end

/controllers/admin/application_controllers.rb

class Admin::ApplicationController < ActionController::Base

http_basic_authenticate_with name: "XXX", password: "XXX"
protect_from_forgery with: :exception


end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    您可以通过设置环境变量在 PgHero 中设置基本身份验证,如下所述:

    https://github.com/ankane/pghero#security

    【讨论】:

    • 谢谢 - 我熟悉默认的安全设置 - 但我想利用 http_basic_authenticate_with
    【解决方案2】:

    基本身份验证应该在比 Rails 更低的级别上完成,并且确实不适用于这种情况。

    相反,您可以使用您的 Web 服务器进行基本的身份验证保护,无论是 Apache、Nginx 还是其他任何东西。基本身份验证从来都不是锁定生产内容的好解决方案,您应该改用完全充实的身份验证系统。

    回答您的问题。 pg-hero 有自己的命名空间,理想情况下不与您的应用程序交互。如果您必须有这种情况(我建议您采用上述建议之一),您可以将引擎中的基本控制器类作为装饰器进行 class_eval 并在那里添加详细信息。我将把这个作为练习留给你。

    【讨论】:

    • 感谢您的反馈。我知道基本身份验证不是最佳方法,但像 github.com/ejschmitt/delayed_job_web 这样的插件使用基本身份验证,如果对这些不同的插件有一个通用的身份验证方法,那就太好了。
    • 在这种情况下最好不要使用基本身份验证。取而代之的是,在设计的引擎盖下运行的守望者。如果您不想这样做,而只是接受给您的默认值,那很好。但不要认为这对您网站的其他部分来说是一个好主意。如前所述,不要在应用程序中进行基本身份验证。在 Nginx 中执行此操作,您也可以在延迟作业网络中执行此操作。
    • 谢谢@Senjai...我的身份验证是国产的...所以我不使用 Devise。