2012-01-04 51 views
4

我已經瞭解瞭如何在Envers的修訂實體表中記錄當前用戶的用戶名。但是,這些信息很少,我找到的信息並沒有那麼有用。如何使用NHibernate 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的同樣的問題。我希望有人能幫幫忙。

回答

2

您可以使用Thread.CurrentPrinicpal屬性(MSDN)。 ASP.NET成員資格機制將它設置爲與當前登錄的用戶相關的身份

+0

在我的情況下,'HttpContext.Current.User'和'Thread.CurrentPrincipal'是否有區別? – Pieter 2012-01-04 11:06:40

+0

我覺得不行,但HttpContext.User嚴格綁定到http環境。 Thread.CurrentPrincipal是更通用的,並將與贏得窗體應用程序以及 – Novakov 2012-01-04 11:40:57

+0

我認爲你是對的,根據這篇文章,因爲我不手動更改任何價值:http://www.hanselman.com/blog/ SystemThreadingThreadCurrentPrincipalVsSystemWebHttpContextCurrentUserOrWhyFormsAuthenticationCanBeSubtle.aspx – Pieter 2012-01-04 11:52:52