【发布时间】: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