Возможно, изучение OAuth2UserService
может помочь. Он вызывается после успешного получения токена OAuth. Вот как это будет работать:
- Пользователь входит в систему с помощью Google или Github Oauth2
Не нужно ничего добавлять. Пусть фильтры по умолчанию позаботятся об этом.
Мое приложение находит (или создает) пользователя базы данных с возвращенной информацией
Создайте свой OAuth2UserService
в виде компонента (он будет выбран автоматически), который позаботится работы с базой данных:
@Component
public class CustomService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest)
throws OAuth2AuthenticationException {
// ... DB logic goes here
}
}
В loadUser(...)
, OAuth2UserRequest
дает вам доступ к соответствующим ClientRegistration
и OAuth2AccessToken
, которые затем можно использовать для запроса или обновления базы данных. .
Мое приложение сохраняет в SecurityContextHolder пользовательскую оболочку аутентификации, которая оборачивает как Oauth2AuthenticationToken, так и пользовательский класс базы данных
Нет необходимости иметь дело с оболочкой! Пользовательский OAuth2User
, который вы строите из информации из базы данных, будет Principal
в OAuth2LoginAuthenticationToken
, который в итоге будет Authentication
, поэтому он будет доступен для вашего приложения. Поскольку вы не имеете дело с Authentication
самостоятельно, вам не придется беспокоиться о сохранении его в SecurityContextHolder
.
При последующих запросах пользовательская оболочка аутентификации доступна для методов контроллера
Ваш Authentication
будет иметь тип OAuth2LoginAuthenticationToken
. Вы можете получить свой пользовательский OAuth2User
, например:
OAuth2LoginAuthenticationToken auth = //...
OAuth2User user = auth.getPrincipal();
Для получения дополнительной информации об основных классах, с которыми вы имеете дело, они могут быть полезны:
Для готовых реализаций OAuth2UserService
проверьте: