Abd*_*gab 6 java backend spring-boot
我有以下成功处理程序,它是 WebSecurityConfig.java 文件的一部分:
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
CustomOAuth2User oauthUser = (CustomOAuth2User) authentication.getPrincipal();
userAuthService.processOAuthPostLogin(oauthUser.getEmail());
response.sendRedirect("/list");
}
})
Run Code Online (Sandbox Code Playgroud)
在应该进行转换的行,它给出了错误:
java.lang.ClassCastException:类 org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser 无法转换为类 com.myapp.myapp.mvc.business.domain.user.CustomOAuth2User
我该如何解决这个问题?
CustomOAuth2User类如下:
public class CustomOAuth2User implements OAuth2User {
private OAuth2User oauth2User;
public CustomOAuth2User(OAuth2User oauth2User) {
this.oauth2User = oauth2User;
}
@Override
public Map<String, Object> getAttributes() {
return oauth2User.getAttributes();
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return oauth2User.getAuthorities();
}
@Override
public String getName() {
return oauth2User.getAttribute("name");
}
public String getEmail() {
return oauth2User.<String>getAttribute("email");
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我认为你的代码来自 codejava.net 对吧?我也遇到了同样的问题,并通过 onAuthenticationSuccess 函数的更新进行了修复。我更改以下代码
CustomOAuth2User oauthUser = (CustomOAuth2User) authentication.getPrincipal();
userAuthService.processOAuthPostLogin(oauthUser.getEmail());
Run Code Online (Sandbox Code Playgroud)
用这个代码
DefaultOidcUser oauthUser = (DefaultOidcUser) authentication.getPrincipal();
String email = oauthUser.getAttribute("email");
userDetailsService.processOAuthPostLogin(email);
Run Code Online (Sandbox Code Playgroud)
现在它正在工作:)
您收到此错误是因为您尚未在应用程序中显式定义范围,并且默认范围还包括 openId。如果您按如下方式定义范围,application.properties则可以将主体强制转换为CustomOAuth2User.
spring.security.oauth2.client.registration.google.scope=email,profile
Run Code Online (Sandbox Code Playgroud)
如果您希望在您的范围中包含 openId,那么您需要将您的主体转换为DefaultOidcUser您可以创建CustomOidcUserService如下所示的服务
@Service
public class CustomOidcUserService extends OidcUserService {
@Autowired private UserRepository userRepository;
@Autowired private RoleRepository roleRepository;
@Override
public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2AuthenticationException {
final OidcUser oidcUser = super.loadUser(userRequest);
return oidcUser;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4628 次 |
| 最近记录: |