Как войти в систему текущего пользователя с помощью NHibernate Envers - PullRequest
4 голосов
/ 04 января 2012

Я посмотрел, как записать имя пользователя текущего пользователя в таблицу сущностей ревизий 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 и связанной с ней ТАК вопрос Я понимаю, что при настройке nHibernate можно зарегистрировать имя пользователя в прослушивателе.

Однако для меня этого недостаточно, поскольку при этом регистрируется имя пользователя, который подключается к приложению первым для каждой транзакции.

Мне нужно предоставить слушателю имя пользователя, связанное с конкретной транзакцией.

Раньше я использовал аудит бедняков, используя прослушиватели событий до и после обновления nHibernate. Здесь Я столкнулся с аналогичной проблемой , так как эти слушатели также связаны с фабрикой сеансов, а не с сеансом. Поэтому я переключился на перехватчики старого стиля, которые могут быть связаны с сеансом внутри OpenSession. Это позволило мне добавить текущего пользователя к перехватчику.

Однако я не знаю, как решить ту же проблему с Энверсом. Я надеюсь, что кто-то может помочь.

1 Ответ

2 голосов
/ 04 января 2012

Вы можете использовать свойство Thread.CurrentPrinicpal ( MSDN ).Механизм членства ASP.NET устанавливает для него идентичность, связанную с текущим зарегистрированным пользователем

...