【发布时间】:2011-06-29 02:37:55
【问题描述】:
我正在构建一个需要了解当前正在发出请求的用户的审计跟踪。我的审计跟踪是使用 ActiveSupport::Notifications 构建的,以接收需要审计的事件。
我想做的是使用 ActiveSupport::Concern 来封装我的审计需求的逻辑,这样我就可以轻松地将审计添加到我系统中的任何模型。
一般来说,这很容易做到。我什至blogged about it a while back。但是,我很难弄清楚如何让当前用户向 Web 服务器发出请求,以便我可以记录谁在我的审计跟踪中进行了哪些更改。
我知道有很多关于“如何在我的模型中获取 current_user”的问题,但我并不是要在模型中这样做,所以我希望有更好的答案。由于我的审计代码与基础架构相关,我希望有某种方法可以利用当前正在处理的请求,或者其他可以明确告诉我当前登录/发出请求的人的方法。
我读过很多“答案”,说要使用线程存储并将 current_user 放在那里。由于许多其他人不喜欢的原因,我不喜欢这个答案 - 不能保证线程存储是安全的。如果服务器使用同一个线程处理多个请求等,它可能会在多个请求中流血。
所以...鉴于我不是试图从我的模型访问 current_user,而是从 ActiveSupport::Concern 或 ActiveSupport::Notifications 事件订阅中访问,有什么好的选择让我知道当前用户是谁是吗?
更新
我正在使用 devise 进行身份验证,它在后端使用 Warden。 devise 通过调用request.env['warden'].authenticate(:scope => :user) 检索 current_user(假设我使用“用户”模型进行身份验证)。
我有没有办法从我的关注或通知订阅中访问当前的request 对象?回到我的 .NET 时代,我本来可以打电话给 HttpContext.Current.Request,一切都会好起来的。 Rails 中的等价物是什么?
【问题讨论】:
-
感谢链接修复。 :) 正要这样做,看到你已经处理好了!
-
您找到解决方案了吗?如果你这样做了,请写下来。谢谢。
标签: ruby-on-rails-3 security notifications audit-trail