У меня есть несколько приложений микросервиса Spring Boot (выпуск 1.5.3), которые все используют хранилище сеансов Redis.У меня есть следующие зависимости от пути к классам, и пользователи могут входить в систему, а их сеансы хранятся в Redis:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Конечные точки контроллера в каждом микросервисе используют аннотацию @Preauthorize, чтобы гарантировать, что текущий пользователь получил соответствующие права.полномочия для вызова конечной точки.Кажется, что безопасность настроена правильно, так как эти аннотации действительно гарантируют, что могут вызывать только те пользователи с правильными ролями.Однако мне также необходимо вывести имя пользователя, который пытается вызвать конечную точку, в журнал аудита.Для этого у меня есть следующий метод, который должен возвращать имя пользователя в виде строки:
private String userDetailsString() {
StringBuilder buf = new StringBuilder();
SecurityContext context = getSecurityContext();
Authentication authentication = context.getAuthentication();
if(authentication != null) {
UserDetails principal = (UserDetails)authentication.getPrincipal();
buf.append("Requested by: ");
buf.append(principal.getUsername());
} else {
buf.append("Requested by: null");
}
return buf.toString();
}
protected SecurityContext getSecurityContext() {
return SecurityContextHolder.getContext();
}
Тем не менее, объект аутентификации всегда нулевой.Почему это?И каковы предпочтительные способы доступа к текущему Принципалу в таком приложении?Обратите внимание, что этот код должен находиться за пределами класса Controller.
Я предполагаю, что код аннотации @Preauthorize должен каким-то образом обращаться к этому принципалу, чтобы определить, имеют ли они соответствующие роли?