我正在使用Sping Boot 实现一个服务器。在用户进行OAuth登录后,我希望用户重定向到一个特定的URI,这样我就可以让用户注册或登录。Google OAuth登录看起来工作正常,但它总是转到"/"
URI。我希望用户重定向到"/api/v1/member/oauth"
这是我的Spring Security设置。
...
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.cors()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/swagger-ui/**", "/swagger-resources/**", "/v2/api-docs")
.permitAll()
.anyRequest()
.permitAll()
.and()
.oauth2Login()
.defaultSuccessUrl("/api/v1/member/oauth")
.userInfoEndpoint()
.userService(customOAuth2MemberService);
}
...
这是用户被定向到的OAuth服务。(此操作正常)
@Service
@RequiredArgsConstructor
public class CustomOAuth2MemberService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) {
OAuth2UserService<OAuth2UserRequest, OAuth2User> delegate = new DefaultOAuth2UserService();
OAuth2User oAuth2User;
try {
oAuth2User = delegate.loadUser(userRequest);
} catch (OAuth2AuthenticationException e) {
throw new CustomException(OAUTH_FAIL);
}
return new DefaultOAuth2User(oAuth2User.getAuthorities(), oAuth2User.getAttributes(), "sub");
}
}
我想获取从上面返回到此URI的DefaultOAuth2User。
@PostMapping("/api/v1/member/oauth")
public Object registerOrLogin(DefaultOAuth2User defaultOAuth2user) {
return ResponseEntity.status(200)
.body(DefaultResponseDto.builder()
.responseCode("MEMBER_LOGIN")
.build());
}
它当前不指向此URI,而是重定向到"/"
。
新增:我通过.defaultSuccessUrl()重定向了它,但现在DefaultOAuth2User
没有随重定向一起发送,导致重定向API的参数为空。如何解决此问题?
2条答案
按热度按时间jogvjijk1#
尝试使用
这将覆盖认证后的行为,并在成功登录后重定向到所需的页面。此外,还有一个类似的方法来设置失败认证的重定向URL
.failureUrl("url")
。sf6xfgos2#
Spring-Security
AbstractAuthenticationProcessingFilter
类有successfulAuthentication()
方法,它定义了当用户成功通过身份验证时会发生什么。你可以注册你的成功处理程序,并把你的重定向逻辑放在那里。但这里有一个问题,当使用OAuth2.0时,我们需要指定
redirect-uri
,在客户端接收到access-token
后,用户将登录到该redirect-uri
。如果您可以使用此Oauth的
redirect-uri
,请不要更改成功处理程序中的重定向,或者如果您需要重定向而不考虑这一点,请使用response.sendRedirect("/social-login-sample/some-page");