【问题标题】:No status code in Rails log after Warden auth failureWarden 身份验证失败后,Rails 日志中没有状态代码
【发布时间】:2016-10-14 23:31:56
【问题描述】:

我已经设置了带有 --api 标志的 Rails 5 (5.0.0.rc1) 应用程序。它正在使用 Warden 进行身份验证。

一切正常,除了当 Warden 身份验证失败时,响应没有被正确记录。日志如下所示:

Started GET "/widgets.json" for ::1 at 2016-06-14 11:38:20 +0000
Processing by WidgetsController#index as JSON
Completed   in 0ms (ActiveRecord: 0.0ms)

或者,在生产中:

I, [2016-06-14T14:12:54.938271 #17625]  INFO -- : [db39f895-eeb1-4861-91d0-5d52c124e37a] Completed   in 1ms (ActiveRecord: 0.0ms)

它当然应该是Completed 401 Unauthorized in...,但不知为何,它不知道响应的状态码。

Warden 身份验证错误被发送到与 Rack 兼容的 ActionController::Metal 衍生控制器,该控制器非常简单:

class UnauthorizedController < ActionController::Metal
  include ActionController::Head

  def self.call(env)
    @respond ||= action(:respond)
    @respond.call(env)
  end

  def respond
    head :unauthorized
  end
end

它使用基本的head 方法来响应(不需要渲染任何东西),所以它的行为可能与在常规Rails 控制器中使用head 相同。但是没有。

如果我尝试使用redirect_to ...render ...(包括相关模块之后),也会发生同样的事情。因此,在 Rack → Rails → Warden → Warden failure 应用程序(控制器)的某个地方,响应的状态代码丢失了。日志知道开始记录请求,并且知道它已被处理,因为它显然会吐出“已完成...”行。但是有些东西没有正确连接。

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 您能将您的最小应用程序代码推送到 github 吗?因为,通常的设置是Rack → Warden → Rails 而不是Rack → Rails → Warden
  • @Uzbekjon 完成。实际上,或多或少准备好了一个。你可以找到它here。是的,你所说的完全有道理(毕竟它是中间件),所以很可能我只是把所有东西都完全倒过来了。

标签: ruby-on-rails logging rack warden


【解决方案1】:

Warden 没有rails 记录器。它只是抛出an exception and catch it, Warden 提供了一种通过before_failure回调处理这个异常的方法

# config/inializers/warden_config.rb
Warden::Manager.before_failure do |env, opts|
  Rails.logger.info("401 Unuthorized")
end

【讨论】:

  • 日志是怎么说的?因为这是我的问题。我的设置已经适用于身份验证等,除了日志没有显示哪个 http 状态被发送到客户端。这就是我的问题
  • @Flambino 我认为wardenrails 不兼容(仅与rack 兼容)。因此warden 没有嵌入Rails.logger。尝试使用before_failure 回调(我已经编辑了我的答案)
  • 当然,我可以在回调中添加我想要的任何其他日志记录,但我有兴趣让 Rails 记录器 - 它似乎知道请求已得到响应 - 以相同的方式记录响应方式与任何其他响应一样。
【解决方案2】:

我认为您遇到了类似于 https://github.com/roidrage/lograge/issues/67#issuecomment-601604344 的问题。这可能是 Rails 日志检测工作方式的限制。我认为控制器完成了对事件的处理,然后导致 Rails 打印带有nil 状态代码的日志消息。但随后 Warden 中间件突然介入并设置了正确的响应代码。您可以将include ActionController::Instrumentation 添加到仪器UnauthorizedController,但您会看到Warden 请求的另一个日志条目。

【讨论】:

    猜你喜欢
    • 2017-07-05
    • 2018-02-24
    • 2019-06-26
    • 2013-11-27
    • 2016-04-05
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多