Ruby on rails 在pg_审核_日志中设置当前_用户

Ruby on rails 在pg_审核_日志中设置当前_用户,ruby-on-rails,ruby-on-rails-3,logging,Ruby On Rails,Ruby On Rails 3,Logging,我想使用pg_audit_log登录rails应用程序。审核日志不仅必须显示已更改的列,还必须显示进行这些更改的用户。这些文档没有说明如何执行此操作,但在查看pg_audit_日志源(postgresql_adapter.rb)后,我看到它从线程局部变量ala读取用户信息: current_user = Thread.current[:current_user] 我考虑过在前后过滤器中设置/取消设置,如下所示: Thread.current[:current_user] = current_u

我想使用pg_audit_log登录rails应用程序。审核日志不仅必须显示已更改的列,还必须显示进行这些更改的用户。这些文档没有说明如何执行此操作,但在查看pg_audit_日志源(postgresql_adapter.rb)后,我看到它从线程局部变量ala读取用户信息:

current_user = Thread.current[:current_user]
我考虑过在前后过滤器中设置/取消设置,如下所示:

Thread.current[:current_user] = current_user

(使用控制器中的current_user helper方法获取当前登录的用户),但这似乎很危险。我现在花时间试图理解rails请求周期和线程是如何交互的,以便更好地了解其危险性。与此同时,我很好奇,是否有任何当前使用pg_audit_log的SO用户已经解决了在用户每次更改记录时将用户id和用户唯一名称记录到日志表的问题。

按照您描述的方式设置当前用户是一种常见的方法。比如说,

一些示例代码可能如下所示:

# in your model
class User < ActiveRecord::Base
  def self.current
    Thread.current[:current_user]
  end
  def self.current=(user)
    Thread.current[:current_user] = user if user.nil? || user.is_a?(User)
  end
end

# in your controller
class ApplicationController < ActionController::Base
    before_filter :set_current_user
    def set_current_user
      User.current = user_signed_in? ? current_user : nil
    end
end
在您的模型中 类用户依赖
线程。当前的
散列提供对控制器管理的对象的模型级访问确实存在争议。例如,请参见以下内容:

令人担忧的是,这一特殊功能在
pg\u审计日志
gem中没有记录

假设您没有积极探索gem的源代码,并且假设您已经独立决定在您自己的应用程序中定义
Thread.current[:current\u user]=something
,用于您自己的目的。在这种情况下,
pg_audit_log
将在您不知情的情况下审核该对象

诚然,
current_user
这个名字被广泛接受,它是指身份验证例程定义的当前登录用户,因此很难想象这个潜在的bug是一个具体的问题,但从设计的角度来看?哎哟

另一方面,由于您知道自己在做什么,因此确保在每个响应周期的开始/结束时设置/取消设置
Thread.current[:current_user]
,应该会使流程安全。至少这是我从阅读大量关于这个话题的帖子中得到的

干杯,朱塞佩