Я только что попытался сохранить данные для входа пользователя OAuth2 в db (h2) с использованием PrincipalExtractor, но мне это не помогло.После входа в систему нет никакой реакции от PrincipalExtractor, хотя я зарегистрировал компонент.База данных и аутентификация работает отлично.
application.yml (часть безопасности)
security:
oauth2:
client:
registration:
discord:
client-id: "secret"
client-secret: "secret"
clientAuthenticationMethod: post
clientAuthenticationScheme: form
authorizationGrantType: authorization_code
scope:
- identify
redirectUriTemplate: "{baseUrl}/login/oauth2/code/discord"
clientName: discordms
provider:
discord:
authorizationUri: https://discordapp.com/api/oauth2/authorize
tokenUri: https://discordapp.com/api/oauth2/token
userInfoUri: https://discordapp.com/api/users/@me
usernameAttribute: username
класс PrincipalExtractor
public class DiscordPrincipalExtractor implements PrincipalExtractor {
private final UserRepository userRepository;
public DiscordPrincipalExtractor(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public Object extractPrincipal(Map<String, Object> map) {
Optional<UserEntityImpl> user = this.userRepository.findById((long) map.get("id"));
if (!user.isPresent()) {
user = Optional.of(new UserBuilder()
.withIdentifier((long) map.get("id"))
.withUsername((String) map.get("username"))
.withDiscriminator((int) map.get("discriminator"))
.withAvatarHash((String) map.get("avatar"))
.withLocale((String) map.get("locale"))
.withAvatarUrl("https://cdn.discordapp.com/" + map.get("id") + "/" + map.get("avatar"))
.withCreated(LocalDateTime.now())
.withLastLogin(LocalDateTime.now())
.build());
} else {
user.get().setLastLogin(LocalDateTime.now());
}
this.userRepository.save(user.get());
return user.get();
}
}
и класс конфигурации безопасности
@Configuration
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.oauth2Login()
.loginPage("/login")
.tokenEndpoint()
.accessTokenResponseClient(new RestOAuth2AccessTokenResponseClient(this.restOperations()))
.and()
.userInfoEndpoint()
.userService(new CustomOAuth2UserServiceImpl(this.restOperations()));
}
@Bean
public PrincipalExtractor principalExtractor(UserRepository userRepository) {
return new DiscordPrincipalExtractor(userRepository);
}
@Bean
public RestOperations restOperations() {
return new RestTemplate();
}
}