【问题标题】:How to log current user with NHibernate Envers如何使用 NHibernate Envers 记录当前用户
【发布时间】:2012-02-02 05:23:55
【问题描述】:

我查看了如何在 Envers 的修订实体表中记录当前用户的用户名。但是,信息很少,而且我设法找到的信息也没有那么有用。

我有一个修订实体和侦听器,如下所示:

[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 环境中使用这两个。配置和会话工厂创建一次,因为这是一项昂贵的操作。对于每个事务,都会打开一个新会话。

从这个NHE Jira问题和这个相关的SO question我了解到配置nHibernate时可以向监听器注册用户名。

但是,这对我来说还不够好,因为它会为每笔交易注册首先连接到应用程序的用户的用户名。

我需要能够向侦听器提供与特定交易相关的用户名。

以前,我使用 nHibernate 的更新前和更新后事件侦听器进行穷人审计。这里I faced a similar problem 因为这些侦听器也与会话工厂而不是会话相关联。因此我切换到旧式拦截器,它可以与OpenSession 中的会话相关联。这允许我将当前用户添加到拦截器。

但是,我不知道如何为 Envers 解决同样的问题。我希望有人可以提供帮助。

【问题讨论】:

    标签: asp.net-mvc nhibernate nhibernate-envers


    【解决方案1】:

    您可以使用 Thread.CurrentPrinicpal 属性 (MSDN)。 ASP.NET 成员机制将其设置为与当前登录用户关联的身份

    【讨论】:

    • 就我而言,HttpContext.Current.UserThread.CurrentPrincipal 之间有区别吗?
    • 我认为没有,但是 HttpContext.User 严格绑定到 http 环境。 Thread.CurrentPrincipal 更通用,也可以与 win forms 应用程序一起使用
    • 我认为你是对的,根据这篇文章,我没有手动更改任何一个值:hanselman.com/blog/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多