Java Spring WebFlux安全OAuth 2.0用户服务

Java Spring WebFlux安全OAuth 2.0用户服务,java,spring,spring-webflux,spring-security-oauth2,Java,Spring,Spring Webflux,Spring Security Oauth2,为了提供一些背景信息,我目前正在从标准的Spring Security 5(带有Spring boot starter web)迁移到Spring webflux——与Spring Cloud Gateway一起用作我的API网关——它不支持Spring boot starter web依赖项 除了我的OAuth2.0用户服务(我在以前的实现中使用过)之外,我还使用了SpringReactor/Webflux。因此,我复制了用户服务-除了我现在无法从新的安全配置中引用它 以下是我的新安全配置:

为了提供一些背景信息,我目前正在从标准的Spring Security 5(带有
Spring boot starter web
)迁移到
Spring webflux
——与Spring Cloud Gateway一起用作我的API网关——它不支持
Spring boot starter web
依赖项

除了我的OAuth2.0用户服务(我在以前的实现中使用过)之外,我还使用了SpringReactor/Webflux。因此,我复制了用户服务-除了我现在无法从新的安全配置中引用它

以下是我的新安全配置:

@配置
@启用WebFluxSecurity
@EnableReactiveMethodSecurity
公共类SecurityConfig{
专用最终OAuth2SuccessHandler OAuth2SuccessHandler;
专用最终OAuth2FailureHandler OAuth2FailureHandler;
专用最终OAuth2UserService customOAuth2UserService;
公共安全配置(OAuth2SuccessHandler OAuth2SuccessHandler、OAuth2FailureHandler OAuth2FailureHandler、OAuth2UserService customOAuth2UserService){
this.oAuth2SuccessHandler=oAuth2SuccessHandler;
this.oAuth2FailureHandler=oAuth2FailureHandler;
this.customOAuth2UserService=customOAuth2UserService;
}
@豆子
公共TokenAuthenticationFilter TokenAuthenticationFilter(){
返回新的TokenAuthenticationFilter();
}
@豆子
公共密码编码器PasswordEncoder(){
返回新的BCryptPasswordEncoder();
}
@豆子
public ReactiveAuthenticationManager ReactiveAuthenticationManager(
用户详细信息服务用户详细信息服务,密码编码器(密码编码器){
用户详细信息存储反应身份验证管理器身份验证管理器=
新的UserDetailsRepositoryReactiveAuthenticationManager(userDetailsService);
authenticationManager.setPasswordEncoder(密码编码器);
返回authenticationManager;
}
@豆子
公共安全WebFilterChain springWebFilterChain(
ServerHttpSecurity(http){
http
.requestCache()文件
.requestCache(NoOpServerRequestCache.getInstance())
.及()
.securityContextRepository(NoOpServerSecurityContextRepository.getInstance())
.授权交易所()
.路径匹配者(
"/",
“/错误”,
“/favicon.ico”,
“/*/*.png”,
“/*/*.gif”,
“/*/*.svg”,
“/*/*.jpg”,
“/*/*.html”,
“/*/*.css”,
“/*/*.js”)
.permitAll()
.pathMatchers(“/login/*”、“/auth/*”、“/oauth2/*”)
.permitAll()
.anyExchange()
.authenticated()
.及()
.oauth2Login()
.authenticationSuccessHandler(oAuth2SuccessHandler)
.authenticationFailureHandler(oAuth2FailureHandler)
.及()
.formLogin()
.disable()
.例外处理()
.authenticationEntryPoint(新authenticationEntryPoint())
.及()
.oauth2Client();
http.addFilterBefore(tokenAuthenticationFilter(),SecurityWebFilterOrder.AUTHENTICATION);
返回http.build();
}
}
这是我的OAuth 2.0自定义用户服务

@服务
公共类OAuth2UserService扩展了DefaultOAuth2UserService{
私有最终UserDao UserDao;
公共OAuth2UserService(UserDao UserDao){
this.userDao=userDao;
}
@凌驾
公共OAuth2User loadUser(OAuth2UserRequest userRequest)引发OAuth2AuthenticationException{
OAuth2User OAuth2User=super.loadUser(userRequest);
OAuth2UserInfo OAuth2UserInfo=
OAuth2UserInfoFactory.getOAuth2UserInfo(
userRequest.getClientRegistration().getRegistrationId(),oAuth2User.getAttributes();
if(StringUtils.isEmpty(oAuth2UserInfo.getEmail()){
抛出新的OAuth2AuthenticationProcessingException(“未找到来自任何提供商的电子邮件”);
}
/*通过电子邮件查找用户*/
User User=userDao.findUserByEmail(oAuth2UserInfo.getEmail());
试一试{
如果(user==null)抛出新的OAuth2AuthenticationProcessingException(“您必须注册!”);
如果(!user.getProvider().equals(AuthProvider.valueOf(userRequest.getClientRegistration().getRegistrationId())){
抛出新的OAuth2AuthenticationProcessingException(
“哇!看来你已经和你的朋友签约了”
+user.getProvider().getValue()
+“。请使用您的”
+user.getProvider().getValue()
+“要登录的帐户。”);
}
user=registerNewUser(userRequest,oAuth2UserInfo);
}捕获(例外e){
}
返回UserPrincipal.create(user,oAuth2User.getAttributes());
}
专用用户注册服务器(OAuth2UserRequest OAuth2UserRequest、OAuth2UserInfo OAuth2UserInfo){
用户=新用户();
user.setProvider(
AuthProvider.valueOf(oAuth2UserRequest.getClientRegistration().getRegistrationId());
setProviderId(oAuth2UserInfo.getId());
user.setUsername(oAuth2UserInfo.getName());
user.setEmail(oAuth2UserInfo.getEmail());
setProfilePicture(oAuth2UserInfo.getImageUrl());
返回userDao.save(用户);
}
}
这与我的旧配置之间的唯一区别是我可以使用它

http
.userInfoEndpoint()
.userService(customOAuth2UserService)
但是,没有选项将其与新的安全配置选项一起使用(我知道)-因此,如果您知道将Spring安全性指向我的自定义用户服务的方法,请回答


非常感谢

您的服务bean用于常规OAuth流。实际需要的是WebFlux,它是
ReactiveOAuth2UserService

您可以通过在
ReactiveOAuth2UserSe上设置断点来验证这一点