ruby-on-rails – 在Warden auth失败后Rails日志中没有状态代码

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在Warden auth失败后Rails日志中没有状态代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_1@我已经使用–api标志设置了一个Rails 5(5.0.0.rc1)应用程序.它使用Warden进行身份验证.

这一切都有效,除了当Warden身份验证失败时,响应未正确记录.日志看起来像这样:

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

或者,在生产中:

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

它当然应该在……中表示已完成401未授权,但无论出于何种原因,它都不知道响应的状态代码.

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

  1. class UnauthorizedController < ActionController::Metal
  2. include ActionController::Head
  3.  
  4. def self.call(env)
  5. @respond ||= action(:respond)
  6. @respond.call(env)
  7. end
  8.  
  9. def respond
  10. head :unauthorized
  11. end
  12. end

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

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

有想法该怎么解决这个吗?

解决方法

Warden没有轨道记录器.它刚刚抛出 an exception and catch it,
Warden提供了一种通过before_failure回调来处理此异常的方法
  1. # config/inializers/warden_config.rb
  2. Warden::Manager.before_failure do |env,opts|
  3. Rails.logger.info("401 Unuthorized")
  4. end

猜你在找的Ruby相关文章