如何从Rails通知中访问current_user?

Der*_*ley 6 security notifications audit-trail ruby-on-rails-3

我正在构建一个审计跟踪,需要知道哪个用户当前正在发出请求.我的审计跟踪是使用ActiveSupport :: Notifications构建的,以接收需要审计的偶数.

我想要做的是使用ActiveSupport :: Concern封装逻辑以满足我的审计需求,这样我就可以轻松地将审计添加到我系统中的任何模型中.

一般来说,这很容易做到.我甚至在一段时间后发表了博客.但是,我很难弄清楚如何让当前用户向Web服务器发出请求,以便我可以记录谁在审计跟踪中进行了哪些更改.

我知道有很多关于"如何在我的模型中获得current_user"的问题,但我并不是要求在模型中进行,所以我希望有更好的答案.由于我的审计代码与基础架构相关,我希望有一些方法可以利用当前正在处理的请求,或者其他可以明确告诉我当前登录/发出请求的内容.

我已经阅读了许多说"使用线程存储并将current_user放在那里"的"答案".我不喜欢这个答案,因为其他人没有这个原因 - 不能保证线程存储是安全的.如果服务器使用相同的线程来处理多个请求等,它可能会导致多个请求流失.

所以...鉴于我不是试图从我的模型中访问current_user,而是从ActiveSupport :: Concern或ActiveSupport :: Notifications事件订阅中获取,有什么好的选择让我知道当前用户是谁?

更新

我正在使用设计进行身份验证,后端使用Warden.设计通过调用检索current_user request.env['warden'].authenticate(:scope => :user)(假设我使用"用户"模型进行身份验证).

我有办法request从我的关注或通知订阅中访问当前对象吗?回到我的.NET时代,我本来可以打电话HttpContext.Current.Request,一切都会好的.Rails中的等价物是什么?

Joh*_*gan -1

您已经有了答案,您所做的与人们在模型中访问请求时相同。current_user 只是在 ApplicationController 上定义的一个方法。当您不在控制器或从其继承的其他类中时,您无法访问该方法。

HttpContext.Current.Request << 我敢打赌这使用了线程存储。我们找到的任何其他解决方案也将是某种级别的线程存储。

要么从控制器中的请求中提取所需的内容并将其作为参数传递下来,要么使用线程存储——但这本质上是危险的。如果您开始使用延迟作业来执行通知或其他操作怎么办?