Я пытаюсь использовать аутентификацию Google. Я использую springboot2, поэтому большая часть конфигурации выполняется автоматически. Сама аутентификация работает хорошо, но потом я хотел бы заполнить Принципал своими данными (роли, имя пользователя и прочее).
Я создал MyUserService, расширяющий DefaultOauth2UserService, и пытаюсь использовать его следующим образом:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
MyUserService myUserService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.userInfoEndpoint()
.userService(myUserService);
}
}
Я проверил с помощью отладчика, что приложение фактически никогда не использует методы loadUser. А вот реализация MyUserService:
@Component
public class MyUserService extends DefaultOAuth2UserService {
@Autowired
UserRepository userRepository;
public MyUserService(){
LoggerFactory.getLogger(MyUserService.class).info("initializing user service");
}
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
OAuth2User oAuth2User = super.loadUser(userRequest);
Map<String, Object> attributes = oAuth2User.getAttributes();
String emailFromGoogle = (String) attributes.get("email");
User user = userRepository.findByEmail(emailFromGoogle);
attributes.put("given_name", user.getFirstName());
attributes.put("family_name", user.getLastName());
Set<GrantedAuthority> authoritySet = new HashSet<>(oAuth2User.getAuthorities());
return new DefaultOAuth2User(authoritySet, attributes, "sub");
}
}
Ответ заключается в том, что по умолчанию, если вы не предоставляете какие-либо области при настройке клиента Google OAuth2, Spring Boot использует значения по умолчанию, предоставленные в классе CommonOAuth2Provider. И области по умолчанию: openid, профиль, электронная почта. При включении области openid Spring Boot будет использовать реализацию интерфейса OAuth2UserService OidcUserService, а не DefaultOAuth2UserService. Поэтому вы должны расширить OidcUserService. И настроить его
Есть ли способ принудительно использовать
OidcUserService
вместоDefaultOAuth2UserService
без добавления областиopenid
?