Сохранить параметр в @RestController, доступный для всего класса или даже приложения, вместо копирования того же кода?

#java #spring #spring-security #oauth #spring-restcontroller

#java #spring #spring-безопасность #oauth #spring-restcontroller

Вопрос:

Допустим, у меня есть несколько классов @RestController в моем приложении.

Я получаю один конкретный параметр из контекста аутентификации OAuth2. Пример запроса выглядит следующим образом:

 @RequestMapping("/contractor")
public Contractor contractor(OAuth2Authentication authentication) {
    String email = String.valueOf(((LinkedHashMap<String, Object>) authentication.getUserAuthentication().getDetails()).get("email"));
    return contractorRepository.findByEmail(email);
}
  

Это работает как шарм, но есть одна проблема. Существует множество конечных точек, основанных на OAuth2Authentication объекте, точнее — на строке электронной почты из

 String.valueOf(((LinkedHashMap<String, Object>) authentication.getUserAuthentication().getDetails()).get("email"));
  

Я не слишком хорошо разбираюсь ни в Spring Security, ни в OAuth2, но есть ли способ каким-то образом автоматически подключить это OAuth2Authentication и сохранить String email как поле в контроллерах Rest, или сохранить его в отдельном классе и внедрить в контроллеры?

Ответ №1:

Я не знаю, работает ли это с OAuth2Authentication , но вы можете попробовать.

Вы можете использовать SecurityContextHolder of spring-security , чтобы получить Authentication объект, подобный этому:

 @RequestMapping("/contractor")
public Contractor contractor() {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    ...
}