JPA AuditorAware не создается для каждого пользователя - PullRequest
0 голосов
/ 12 февраля 2020

Я внедрил аудит с использованием аудита JPA. Мой код выглядит следующим образом:

@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorAware")
public class JpaConfiguration {

    @Bean
    @Scope(value= ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public AuditorAware<String> auditorAware() {
        final String currentUser;
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if(null != authentication) {
            currentUser = authentication.getName();
        } else {
            currentUser = null;
        }
        return () -> Optional.ofNullable(currentUser);
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что если я войду в систему с одним пользователем и выполню какую-либо операцию, она работает нормально. Но когда я выхожу и захожу с другим пользователем, он все еще использует только последнего пользователя.

После отладки кода я обнаружил, что Spring не создает bean-компонент AuditorAware для каждого пользователя. Он ведет себя как синглтон. Даже я указываю область действия как прототип, но он ведет себя как синглтон.

1 Ответ

2 голосов
/ 12 февраля 2020

AuditorAware должен быть одиночным. Вы должны получить текущего пользователя каждый раз, когда вызывается AuditAware.getCurrentAuditor. Не один раз

Перепишите свой код примерно так.


@Bean
public AuditorAware<String> auditorAware() {
    return () -> getCurrentAuthentication().map(Authentication::getName());
}

private Optional<Authentication> getCurrentAuthentication() {
  return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication());
}
...