#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();
...
}