DefaultOidcUser 无法转换为 CustomOAuth2User 类

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)

现在它正在工作:)


Anu*_*rag 5

您收到此错误是因为您尚未在应用程序中显式定义范围,并且默认范围还包括 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)