Как получить getUserPrincipal(). GetUserName() при реализации интерфейса Spring Data JPA AuditorAware

Я пытаюсь использовать Spring Data JPA (1.6.2) в моем текущем проекте. Кажется, все работает хорошо, но я застрял при реализации интерфейса AuditorAware.

Мое приложение будет развернуто на старом совместимом портале Apache Jetspeed JSR168. Этот портал заботится об аутентификации / авторизации пользователя. Поэтому мне не нужно использовать каркас безопасности, такой как Spring Security или Shiro. Другие рамки в моем приложении:

  1. Struts 1.2.4 (с помощью Struts-Portal-Bridge)
  2. Весна 3.2.10
  3. 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,

Другие вопросы по тегам