Публикация моего собственного решения на случай, если оно пригодится кому-то еще в будущем.
Spring security (по умолчанию) фактически хранит информацию о пользователе в переменной Threadlocal, ноcommon-api не будет иметь к нему доступа, пока не добавит зависимость безопасности пружины - если это так, к пользовательской информации можно получить доступ (при условии, что вы выполняете в том же потоке), используя следующий фрагмент:
SecurityContext secureContext = SecurityContextHolder.getContext();
Authentication auth = secureContext.getAuthentication();
Object principal = auth.getPrincipal();
String userName = null;
if (principal instanceof UserDetails) {
UserDetails userDetails = (UserDetails) principal;
userName = userDetails.getUsername();
} else {
userName = principal.toString();
}
Однако решение, которое я реализовал, было другим, потому что я не хотел внедрять Spring Security в проект common-api, и я не всегда мог полагаться на Spring Security как на пользователя API.Итак, я создал bean-компонент Singleton в common-api, который содержит мои собственные определенные переменные ThreadLocal, которые могут быть установлены из других проектов и доступны из проекта common-api (опять же, при условии, что они работают в одном потоке).
Фрагмент кода:
public class CommonAPIThreadLocalStorageManager {
private static CommonAPIThreadLocalStorageManager instance;
// Typical singleton private constructor, static getInstance here
private ThreadLocal<String> userID = new ThreadLocal<String>();
public String getUserID() {
return userID.get();
}
public void setUserID(String userID) {
this.userID.set(userID);
}