Asp.net mvc 如何使用NHibernate Envers记录当前用户
我已经了解了如何将当前用户的用户名记录在Envers的修订实体表中。然而,几乎没有什么信息,而我设法找到的信息也没有那么大的帮助 我有一个修订实体和侦听器,如下所示:Asp.net mvc 如何使用NHibernate Envers记录当前用户,asp.net-mvc,nhibernate,nhibernate-envers,Asp.net Mvc,Nhibernate,Nhibernate Envers,我已经了解了如何将当前用户的用户名记录在Envers的修订实体表中。然而,几乎没有什么信息,而我设法找到的信息也没有那么大的帮助 我有一个修订实体和侦听器,如下所示: [RevisionEntity(typeof(EnversRevisionListener))] public class EnversRevisionEntity : DefaultRevisionEntity { public virtual string UserName { get; set; } } publi
[RevisionEntity(typeof(EnversRevisionListener))]
public class EnversRevisionEntity : DefaultRevisionEntity
{
public virtual string UserName { get; set; }
}
public class EnversRevisionListener : IRevisionListener
{
private string _userName = "unknown";
public EnversRevisionListener(string userName)
: base()
{
_userName = userName;
}
public void NewRevision(object revisionEntity)
{
var casted = revisionEntity as EnversRevisionEntity;
if (casted != null)
{
casted.UserName = _userName;
}
}
}
我想在ASP.NET环境中使用这两个。配置和会话工厂只创建一次,因为这是一项昂贵的操作。对于每个事务,将打开一个新会话
从这个问题和这个相关问题中,我了解到在配置nHibernate时可以向侦听器注册用户名
但是,这对我来说还不够好,因为这会为每个事务首先注册连接到应用程序的人的用户名
我需要能够向侦听器提供与特定事务相关的用户名
以前,我使用nHibernate的更新前和更新后事件侦听器使用poor man的审计。在这里,这些侦听器也与会话工厂关联,而不是与会话关联。因此,我切换到旧式拦截器,它可以与OpenSession
中的会话相关联。这允许我将当前用户添加到拦截器
然而,我不知道如何为Envers解决同样的问题。我希望有人能帮忙。您可以使用Thread.CurrentPrinicpal属性()。ASP.NET成员机制将其设置为与当前登录的用户关联的标识在我的情况下,HttpContext.Current.useren
Thread.CurrentPrincipal
之间是否存在差异?我认为没有,但HttpContext.user严格受http环境约束。Thread.CurrentPrincipal更通用,也可以与win forms应用程序一起使用。根据本文,我认为你是对的,因为我没有手动更改任何一个值: