我在项目中使用NHibernate,我需要进行数据审计。我在codeproject上找到了this article,它讨论了IInterceptor接口。
您首选的审核数据方式是什么?你使用数据库触发器吗?你是否使用了与文章中讨论的相似的东西?
答案 0 :(得分:14)
对于NHibernate 2.0,您还应该查看Event Listeners。这些是IInterceptor接口的演变,我们成功地将它们用于审计。
答案 1 :(得分:5)
[编辑]
发布NH2.0后,请按照以下建议查看事件监听器。我的答案已经过时了。
IInterceptor是以非侵入方式修改nhibernate中任何数据的推荐方法。在没有您的应用程序代码需要知道的情况下,它对于数据的解密/加密也很有用。
数据库上的触发器将日志记录(应用程序问题)的责任转移到DBMS层,从而有效地将您的日志记录解决方案与数据库平台联系起来。通过将审计机制封装在持久层中,您可以保持平台独立性和代码可传输性。
我在生产代码中使用拦截器来在几个大型系统中提供审计。
答案 2 :(得分:3)
我更喜欢你提到的CodeProject方法。
数据库触发器的一个问题是,除了使用与ActiveDirectory结合的集成安全性作为对SQL Server的访问权之外别无选择。原因是您的连接应该继承触发连接的用户的身份;如果您的应用程序使用名为“sa”的帐户或其他用户帐户,则“user”字段仅反映“sa”。
可以通过为应用程序的每个用户创建一个命名的SQL Server帐户来覆盖它,但这对于非Intranet,面向公众的Web应用程序来说是不切实际的。
答案 3 :(得分:3)
我确实喜欢上面提到的Interceptor方法,并在我正在进行的项目中使用它。
然而,值得强调的一个明显缺点是这种方法只会审核通过您的应用程序进行的数据更改。除非您记得同时执行审计表插入,否则不会审计任何直接数据修改,例如您可能需要不时执行的ad-hoc SQL脚本(它总是会发生!),除非您记得执行审计表插入。
答案 4 :(得分:3)
我知道这是一个老问题。但我想根据NH 2.0中的新事件系统来回答这个问题。事件监听器比拦截器更适合类似审计的功能。艾恩德上个月在他的博客上写了一个很好的例子。这是他博客文章的URL -
答案 5 :(得分:2)
作为一种完全不同的方法,您可以将装饰器模式与您的存储库一起使用。
说我有
public interface IRepository<EntityType> where EntityType:IAuditably
{
public void Save(EntityType entity);
}
然后,我们有了NHibernateRepository:
public class NHibernateRepository<EntityType>:IRepository<EntityType>
{
/*...*/
public void Save ( EntityType entity )
{
session.SaveOrUpdate(entity);
}
}
然后我们可以有一个审计存储库:
public class AuditingRepository<EntityType>:IRepository<EntityType>
{
/*...*/
public void Save ( EntityType entity )
{
entity.LastUser = security.CurrentUser;
entity.LastUpdate = DateTime.UtcNow;
innerRepository.Save(entity)
}
}
然后,使用IoC框架(StructureMap,Castle Windsor,NInject),您可以在没有其余代码的情况下全部构建它,并且知道您正在进行审计。
当然,你如何审核级联集合的元素完全是另一个问题......