在 Rails 中审计记录

Posted

技术标签:

【中文标题】在 Rails 中审计记录【英文标题】:Auditing Records In Rails 【发布时间】:2014-12-07 07:26:27 【问题描述】:

我有一个 Rails 3.2.14 应用程序,它有一个 Call 模型和许多不同的关联。我希望能够跟踪Call 模型的更改并以某种方式显示Call 显示视图中的更改列表。

我一直在阅读有关 audited gem 的信息,它看起来可能会奏效。但在我深入研究之前,我想知道以下几点。

如何从显示视图中调用审核?我假设我可以做一些事情,比如传递一个块:

<% @call.audits.each do |a| %> <%= a.action %> <%= a.audited_changes %> <% end %>

当我需要查看对特定调用所做的更改时,这样的内容是否可以在显示视图中使用?

audited gem 如何处理关联,尤其是has_many_through

我希望尽快实现此功能,但不想在我的应用中引入任何问题。我认为在开发环境中安装可能是最好的途径?

如果有人有使用此 gem 的经验或可以帮助提供答案,我将不胜感激。

更新 所以我尝试安装审核的 gem,我能够显示审核操作和 audited_changes。但是audited_changes的格式是一个序列化的hash。我怎样才能反序列化它并使字段友好?此外,在使用 has_many_through 关系/连接表时,gem 似乎不会记录更改。所以我现在拥有的是一个半工作的审计 gem,其中的数据对用户不友好。有什么方法可以美化它并使其对用户有意义?

call.rb 摘录

 has_many :call_units
  has_many :units, through: :call_units
  belongs_to :nature
  belongs_to :service_level
  belongs_to :patient_sex
  belongs_to :insurance
  belongs_to :region
  has_many :call_special_equipments
  has_many :special_equipments, :through => :call_special_equipments
  belongs_to :transferred_from, :foreign_key => :transfer_from_id, :class_name => 'Facility'
  belongs_to :transferred_to, :foreign_key => :transfer_to_id, :class_name => 'Facility'
  belongs_to :parent_call, class_name: "Call"
  has_many :notes
  belongs_to :cancel_reason

【问题讨论】:

我看到您最近的编辑是一年前,但必须问:您是否设法以可读的方式显示您的审核?如果没有,我可以提供帮助。 我知道现在已经很久了,但我似乎无法弄清楚如何在索引页面中显示更改,我已将 audited 添加到用户模型中。 【参考方案1】:

我已使用paper_trail gem 来审核记录更改这是另一个 SO 答案,它显示了如何显示记录增量:Display all versions of individual records in Papertrail

没有贬低经过审核的 gem。

【讨论】:

你能详细说明你是如何做到的吗?还包括关联记录并且有很多直通关系? 您希望使用Call 模型跟踪哪些关联?您可以将相关的源代码添加到您的问题中吗? 好的,我会发布我的通话模型的摘录。 我已经发布了来自 Call 模型的关联。我正在尝试跟踪对多态和has_many_through 关联的更改。您能否提供有关如何实施 paper_trail 以跟踪更改的答案?我真的很想让这个工作。 @cz3ch - 我正在处理一个类似的问题,经过一番研究后推断,没有现成的解决方案可以跟踪相关模型的更改,从而使对用户有意义的这些变化的呈现。我选择编写一个自定义类,该类将跟踪关联模型的更改并将它们存储在父模型的 Papertrail 元数据列中。这似乎是最好的解决方案,但如果其他人有更好的解决方案,我们很高兴能改正。【参考方案2】:

我们使用这样的东西:

# app/views/audit_trail/index.html.haml
.table-responsive
  %table
    %thead
      %tr
        %th Record
        %th Associated With
        %th By
        %th Action
        %th Changes
        %th Version
        %th Remote Address
        %th Timestamp

    %tbody
      = render @audits

# app/views/audited/adapters/active_record/audits/_audit.html.haml
%tr
  %td
    = "#audit.auditable_type:"
    %br
    = "'#audit.auditable.try(:audited_friendly)'"
  %td= audit.associated.try(:audited_friendly)
  %td= audit.user.try(:name)
  %td= audit.action
  %td= audit.audited_changes
  %td= audit.version
  %td= audit.remote_address
  %td= audit.created_at

请注意,audited_friendly 是我们添加到已审核模型的方法。例如,User 模型返回 name 属性,但 Pattern 模型返回 label 属性。

更新

以下是具有审计 (User) 的对象和与记录关联的对象 (Client) 的审计记录的相关控制器方法:

# app/controllers/audits_controller.rb
  def index
    load_user if params[:user_id]
    load_client if params[:client_id]

    @audits = find_audits
  end

  def load_user
    @auditable = User.find(params[:user_id])
  end

  def load_client
    @associated = Client.find(params[:client_id])
  end

  def find_audits
    if @auditable
      scope = @auditable.audits
    elsif @associated
      scope = Audited::Audit.where(associated_type: @associated.class.name, associated_id: @associated.id)
      scope = scope.where(auditable_type: params[:auditable_type]) if params[:auditable_type]
    end
    scope.reorder("id DESC, version DESC")
  end

【讨论】:

你能把控制器方法也贴在这里

以上是关于在 Rails 中审计记录的主要内容,如果未能解决你的问题,请参考以下文章

rails - 身份验证、授权和审计混淆

审计与 Rails Audited gem 的深度关联

Oracle 审计功能

如何从 Rails 通知访问 current_user?

oracle 审计

学习Oracle的审计(Auditing)