SecurityContextHolder.getContext (). GetAuthentication () всегда возвращает 'anonymousUser'

Я создал загрузочное приложение Spring со следующей конфигурацией:

  • Spring boot 2.1.0.RELEASE
  • OpenJdk 11

В моем проекте есть класс AuditConfiguration, который выглядит так:

@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
public class AuditConfiguration {

    @Bean
    public AuditorAware<String> auditorProvider() {
        return new AuditorAwareImpl();
    }

    class AuditorAwareImpl implements AuditorAware<String> {
        @Override
        public Optional<String> getCurrentAuditor() {
            Principal principal = 
            SecurityContextHolder.getContext().getAuthentication();
            return Optional.of(principal.getName());
        }
    }
}

а SecurityContextHolder.getContext().getAuthentication() всегда возвращает anonymousUser.

Однако следующий код возвращает правильное имя пользователя.

@RestController
@RequestMapping("/history")
public class HistoryEndpoint {

    @RequestMapping(value = "/username", method = RequestMethod.GET)
    @ResponseBody
    public String currentUserName(Principal principal) {
        return principal.getName();
    }
}

Мне нужна ваша помощь в решении этой проблемы.

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

Kamil W 08.11.2018 11:20

вы устанавливаете объект аутентификации в контексте безопасности Spring?

Raheela Aslam 08.11.2018 11:26

Пожалуйста, покажите свои файлы конфигурации

shazin 08.11.2018 12:13
2
3
2 810
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я получил аутентифицированного пользователя, используя следующий класс. у меня была проблема с JPA Auditing. @CreatedBy всегда сохранял null. затем я попытался получить аутентифицированного пользователя SecurityContextHolder.getContext().getAuthentication(), используя этот метод. этот метод вернул annonymousUser. однако моя проблема исправлена.

@ManagedBean
@EnableJpaAuditing
public class SpringSecurityAuditorAware implements AuditorAware<String> {

private final HttpServletRequest httpServletRequest;

public SpringSecurityAuditorAware(HttpServletRequest httpServletRequest) {
    this.httpServletRequest = httpServletRequest;
}

@Override
public Optional<String> getCurrentAuditor() {
    return Optional.ofNullable(httpServletRequest.getUserPrincipal())
            .map(Principal::getName);
}
}

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