【问题标题】:How to redact information from Paper Trail's versions?如何编辑来自 Paper Trail 版本的信息?
【发布时间】:2018-11-01 12:38:02
【问题描述】:

为了遵守欧盟的 GDPR(用户隐私),我们需要从我们的记录版本中编辑个人身份信息。我想出了一些似乎可行的方法,但我应该问问是否有既定的方法可以做到这一点。

class User < ActiveRecord::Base
  has_paper_trail
end

user = User.create! name: 'Josh'
user.update_attributes name: 'Josh2'
user.update_attributes name: 'Josh3'
user.destroy!

def self.get_data
  PaperTrail::Version.order(:id).where(item_id: 1).map { |ver| [ver.event, ver.object, ver.object_changes] }
end

# =====  BEFORE  =====
get_data
# => [["create", nil, {"id"=>[nil, 1], "name"=>[nil, "Josh"]}],
#     ["update", {"id"=>1, "name"=>"Josh"}, {"name"=>["Josh", "Josh2"]}],
#     ["update", {"id"=>1, "name"=>"Josh2"}, {"name"=>["Josh2", "Josh3"]}],
#     ["destroy", {"id"=>1, "name"=>"Josh3"}, nil]]

PaperTrail::Version.where_object_changes(name: 'Josh').each do |ver|
  ver.object['name'] = 'REDACTED' if ver.object && ver.object['name'] == 'Josh'
  if oc = ver.object_changes
    oc['name'] = oc['name'].map { |name| name == 'Josh' ? 'REDACTED' : name }
    ver.object_changes = oc
  end
  ver.save!
end

# =====  AFTER  =====
get_data
# => [["create", nil, {"id"=>[nil, 1], "name"=>[nil, "REDACTED"]}],
#     ["update",
#      {"id"=>1, "name"=>"REDACTED"},
#      {"name"=>["REDACTED", "Josh2"]}],
#     ["update", {"id"=>1, "name"=>"Josh2"}, {"name"=>["Josh2", "Josh3"]}],
#     ["destroy", {"id"=>1, "name"=>"Josh3"}, nil]]

更新:实际上,我还需要通过关联来确定记录的范围,因此我的示例还不够。

【问题讨论】:

  • 我投票结束这个问题,因为 Stack Overflow 不是关于如何处理 GDPR 合规性的法律权威。
  • 您是否需要跟踪是否有更改? Papertrail 具有 :ignore:only 选项,仅监视某些属性的变化。
  • 你为什么只编辑Josh?如果我将我的名字更改为Joshua,我希望它也会被编辑,因为它仍然在update 中识别出我的个人身份。另外,针对已知键而不是特定键值对进行编辑会更容易
  • @tadman 不寻求法律建议,只是寻求如何在 PaperTrail 中编辑信息。
  • @mrrogers 我不确定我是否理解这个问题。我们跟踪对字段子集的所有更改,我需要从这些历史记录中编辑特定的 PII。我们仅将这些功能用于减少垃圾邮件的无关信息。在对数据进行编辑之前,我们期待完整的正常功能。

标签: ruby paper-trail-gem redaction


【解决方案1】:

为了遵守欧盟的 GDPR(用户隐私),我们需要从我们的记录版本中编辑个人身份信息。我想出了一些似乎可行的方法,但我应该问问是否有既定的方法可以做到这一点。

没有,截至今天,2018 年 5 月 30 日,没有用于 GDPR 修订的内置功能或文档化解决方案。

PaperTrail 提供了许多迭代和查询versions 表中记录的方法。 where_object_changes 就是这样一个特性,但它会生成一些相当复杂的 SQL。

where_object_changes(name: 'Joan')

SELECT "versions".*
FROM "versions"
WHERE .. ("versions"."object_changes" LIKE '%
name:
- Joan
%' OR "versions"."object_changes" LIKE '%
name:
-%
- Joan
%')

您可能有理由担心此查询的正确性。事实上,从 PT 9.0.0 开始,使用 where_object_changes 从文本列中读取 YAML 会引发错误。仍然允许从文本或 json/b 列中读取 JSON。

不管怎样,如果我成功地让你对如此复杂的 SQL 保持警惕,那么你应该选择一种更简单的方法,也许迭代该用户的所有版本记录 (user.versions.find_each)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2014-08-31
    相关资源
    最近更新 更多