【问题标题】:Setting current_user in pg_audit_log在 pg_audit_log 中设置 current_user
【发布时间】:2013-01-04 19:26:21
【问题描述】:

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

current_user = Thread.current[:current_user]

我考虑过在过滤器前后设置/取消设置,如下所示:

Thread.current[:current_user] = current_user

(使用控制器中的 current_user 辅助方法来获取当前登录的用户),但这似乎很危险。我现在花时间尝试了解 Rails 请求周期和线程如何交互,以便更好地了解危险程度。同时,我很好奇当前使用 pg_audit_log 的任何 SO 用户是否已经解决了每次用户对记录进行更改时将 user_id 和 user_unique_name 记录到日志表的需要。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 logging


    【解决方案1】:

    按照您描述的方式设置当前用户是一种常见的方法。例如,请参阅http://rails-bestpractices.com/posts/47-fetch-current-user-in-models

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

    # 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
    

    【讨论】:

      【解决方案2】:

      依靠Thread.current 哈希来提供对控制器管理的对象的模型级访问确实是有争议的。例如,请参阅以下内容:

      Safety of Thread.current[] usage in rails

      令人担忧的是,pg_audit_log gem 中没有记录此特定功能。

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

      当然,current_user 这个名字被广泛接受,表示身份验证例程定义的当前登录用户,很难将这个潜在的错误想象为一个具体问题,但从设计的角度来看呢?哎哟。

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

      干杯,朱塞佩

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 2018-03-22
        • 1970-01-01
        • 2014-04-20
        • 2011-01-09
        相关资源
        最近更新 更多