我的目标是通过身份验证服务(如 google 或 github)对用户进行身份验证。
我尝试同时使用两者,但我不明白为什么在 github 上我的身份验证是用我的 OAuth2UserService 处理的,而在 google 上,这是我的 OidcUserService 被调用。
我希望两者都调用 OidcUserService,因为我只需要身份验证。
那么,为什么会有这样的差异呢? 你能告诉我这个吗? 我是不是错过了什么?
一些代码来说明
@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
OAuth2User user = super.loadUser(userRequest);
log.info("OAuth2User loading");
return user;
}
}
@Service
public class CustomOidcUserService extends OidcUserService {
@Override
public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2AuthenticationException {
OidcUser user = super.loadUser(userRequest);
log.info("OidcUser loading");
return user;
}
}
// MyAppSecurityConfig.java
@Configuration
public class MyAppSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
;
}
}
# application.properties
spring.security.oauth2.client.registration.github.client-id=xxxx
spring.security.oauth2.client.registration.github.client-secret=xxx
spring.security.oauth2.client.registration.google.client-id=xxxx
spring.security.oauth2.client.registration.google.client-secret=xxxx
您观察到的行为是由 spring-boot 中预定义的 oauth2 配置引起的:
对于常见的 OAuth2 和 OpenID 提供商,包括 Google、Github、 Facebook 和 Okta,我们提供了一组默认提供商(google、 分别是 github、facebook 和 okta)。如果您不需要自定义这些提供程序,您可以设置 提供者属性为您需要推断默认值的提供者属性。 此外,如果客户端注册的密钥与默认值匹配 支持的提供者,Spring Boot 也会推断这一点。
即Spring Boot 已预先配置用于 google 服务的 openid-connect 和用于 github 的通用 oauth2。