如何审计实体的所有字段

本文关键字:字段 实体 何审计 审计 | 更新日期: 2023-09-27 18:05:52

我正在使用NHibernate并寻找一个解决方案,使我能够审计实体中所有字段的更改。我希望能够为每个实体创建一个历史表,即Users -> usershhistory,它将具有与Users表和其他字段相同的结构,如操作类型(更新,删除),用户的userid进行更改等。我不想为每个实体定义这样的类。我正在寻找类似History<T>(即History<User>)的东西,因为这些条目不属于我的域,只用于准备对实体所做的更改列表。我还认为最好在代码中创建对这些表的插入,而不是创建sql触发器。基本上,我只需要在更新或删除历史表中创建记录的副本,我希望插入由NHibernate生成。我还需要从历史表中读取记录-正如我所说,这些表将由实体字段和一些常见的历史字段组成。

我找不到关于如何创建这样的解决方案的指导。我所能找到的是添加UserModified, UpdatedTimestamp等,如果我已经在实体上有这样的字段。但是,我需要实体的完整历史记录,而不仅仅是上次更改条目的信息。

提前感谢您的帮助。

如何审计实体的所有字段

有一个很酷的NHibernate开源审计跟踪,叫做NHibernate。envers https://bitbucket.org/RogerKratz/nhibernate.envers,所以你不必重新发明轮子。

它透明地集成到NHibernate中,不需要改变你的域模型或映射。

就像添加引用和调用一样简单:

var enversConf = new FluentConfiguration(); 
enversConf.Audit<User>();
nhConf.IntegrateWithEnvers(enversConf);

nhConf是你的NHibernate配置对象。

对于对象的每次更改都创建一个新的修订,您可以通过调用

请求Envers检索一个修订:
var reader = AuditReaderFactory.Get(session);
var userInRevOne = reader.Find<User>(user.Id, 1);

或列出所有修订等。修订数据本身可以用用户名、用户id、时间戳等(任何你能想到的)来充实。

编辑:它可以在NuGet上找到:http://nuget.org/packages/NHibernate.Envers

我认为最好的解决方案是使用事件侦听器:

http://darrell.mozingo.net/2009/08/31/auditing-with-nhibernate-listeners/

我编写了类似于上面的内容(在找到该博客后进行了修改),只是我将结果存储在XML中。

例句:

public void OnPostUpdate(PostUpdateEvent updateEvent)
{
    if (updateEvent.Entity is AuditItem)
        return;
    var dirtyFieldIndexes = updateEvent.Persister.FindDirty(updateEvent.State, updateEvent.OldState, updateEvent.Entity, updateEvent.Session);
    var data = new XElement("AuditedData");
    foreach (var dirtyFieldIndex in dirtyFieldIndexes)
    {
        var oldValue = GetStringValueFromStateArray(updateEvent.OldState, dirtyFieldIndex);
        var newValue = GetStringValueFromStateArray(updateEvent.State, dirtyFieldIndex);
        if (oldValue == newValue)
        {
            continue;
        }
        data.Add(new XElement("Item",
                              new XAttribute("Property", updateEvent.Persister.PropertyNames[dirtyFieldIndex]),
                              new XElement("OldValue", oldValue),
                              new XElement("NewValue", newValue)
                             ));
    }
    AuditService.Record(data, updateEvent.Entity, AuditType.Update);
}

审计服务只是构建添加一些额外的数据,如IP地址,用户(如果有的话),它是一个系统/服务更新或通过网站或用户操作,等等。

然后在我的数据库i存储XML如下:

<AuditedData>
  <Item Property="Awesomeness">
    <OldValue>above average</OldValue>
    <NewValue>godly</NewValue>
  </Item>
  <Item Property="Name">
    <OldValue>Phill</OldValue>
    <NewValue>Phillip</NewValue>
  </Item>
</AuditedData>

我也有插入/删除监听器。

你要找的是事件监听器(不幸的是,我无法链接到相关文档,因为nhforge.org wiki正在经历NRE…)。

检查复杂的NHibernate审计

下面是一个完整的示例:http://www.shawnduggan.com/?p=89.

这篇文章还包括:审计日志nhibernate