Как получить getUserPrincipal(). GetUserName() при реализации интерфейса Spring Data JPA AuditorAware
Я пытаюсь использовать Spring Data JPA (1.6.2) в моем текущем проекте. Кажется, все работает хорошо, но я застрял при реализации интерфейса AuditorAware.
Мое приложение будет развернуто на старом совместимом портале Apache Jetspeed JSR168. Этот портал заботится об аутентификации / авторизации пользователя. Поэтому мне не нужно использовать каркас безопасности, такой как Spring Security или Shiro. Другие рамки в моем приложении:
- Struts 1.2.4 (с помощью Struts-Portal-Bridge)
- Весна 3.2.10
- JPA (Hibernate 3.6.10 в качестве поставщика ORM)
Я хотел бы использовать аннотированные поля @CreatedBy и @LastModifiedBy в моих сущностях (у меня работают @CreatedDate и @LastModifiedDate). В моем приложении я обычно получаю имя пользователя с помощью request.getUserPrincipal(). GetUserName ().
Но как я могу получить имя пользователя при реализации интерфейса AuditorAware?
Пример реализации из документов JPA Spring Data:
class SpringSecurityAuditorAware implements AuditorAware<User> {
public User getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated()) {
return null;
}
return ((MyUserDetails) authentication.getPrincipal()).getUser();
}
}
Как-то я хочу реализовать AuditorAware, как это:
class MyAuditorAware implements AuditorAware<String> {
public String getCurrentAuditor() {
return <<principal from servlet- or portletcontext>>.getUserName();
}
}
Как я могу сделать это, не добавляя дополнительную структуру?
1 ответ
Как уже упоминал Константин в своем комментарии, вы, вероятно, захотите сохранить имя субъекта в области, подходящей для запроса. Это вполне может быть ThreadLocal
, Это позволяет легко получить его позже в вашем AuditorAware
реализация.
Чтобы остаться с именами Spring, позвоните PrincipalContextHolder
, В качестве отправной точки вы можете посмотреть на источник JodaTimeContextHolder для простой реализации ContextHolder
,