Warden身份验证失败后,Rails日志中没有状态代码



我已经设置了一个带有--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...,但无论出于什么原因,它都不知道响应的状态代码。

管理员身份验证错误被发送到机架兼容的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 ...(在包含相关模块之后),也会发生同样的情况。所以在机架的某个地方→轨道→管理人→管理员故障应用程序(控制器)响应的状态代码丢失。日志知道开始记录请求,并且知道它已经被处理了,因为它显然会吐出"Completed…"行。

关于如何解决这个问题有什么想法吗?

典狱长没有rails记录器。它只是抛出一个异常并接住它,Warden提供了一种通过before_failure回调来处理此异常的方法

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

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

相关内容

最新更新