2015-11-29 10 views
1

Я присоединился к проекту, который был построен в течение года с использованием Spring и Hibernate с методологией Agile, и он не использовал Spring Data и имеет свой собственный пользовательский класс (не являющийся потомком org.springframework.security.core.userdetails.User) ,Аутентификация Spring + Hibernate (нет данных весны)

Аудит возник как новая функция, которая будет реализована. (Недостаточно регистрировать, какие контроллеры были вызваны, мы должны регистрировать каждое изменение поля БД, и какой пользователь это сделал. Один контроллер может привести к изменению большого количества полей БД.) Какие у меня параметры?

Я смотрел на Хэйверс, Энверс и Аудит4j. Хэйвс требует Spring Data, так что это не так. Единственным требованием Envers является Hibernate, который соответствует требованиям, но я до сих пор не вижу, как объект User будет передан ему из контроллера (токен аутентификации пользователя находится в объекте запроса).

+0

JaVers вообще не требует весны, я смог настроить его только с помощью Hibernate. – vitro

ответ

1

Hibernate Envers только дает вам управление версиями (что случилось с объектом в какое время), но это не поможет вам понять, кто сделал это изменение.

Простым решением для части, состоящей в том, чтобы создать два новых поля для всех объектов, которые должны быть проверены (то есть в базовом классе, например AbstractAuditableEntity): User createdBy; и User lastModifiedBy;. Добавьте два метода (я предполагаю, что вы используете Spring Security здесь):

@PrePersist 
protected void setCreatedBy() {createdBy = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();} 

@PreUpdate 
protected void setCreatedBy() {lastModifiedBy = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();} 
+1

Hibernate поддерживает пользовательский 'RevisionEntity', где вы можете хранить такую ​​информацию с каждой ревизией. –

+0

Я еще не понимаю Spring Security. Мне кажется странным, что я могу получить принципала, вызвав метод статических объектов вместо того, чтобы получить SecurityContext с помощью параметра метода. Имеет ли Spring какую-то скрытую блокировку в SecurityContext для каждого сеанса HTTP? – zslevi

+0

@zslevi Обычно он использует ThreadLocal, который заполняется в ServletFilter –

Смежные вопросы