首页 > 解决方案 > spring-security-oauth2 中的 Insteate 自定义 OAuth2User 导致反序列化错误

问题描述

我在我的 Web 应用程序中使用 spring-security-oauth2-client 。我想使用自定义用户类型。但是当 Insteate OAuthUser 使用身份验证服务器发送的请求正文时出错。

我使用自定义用户类型的原因是因为我想在 hashmap 中使用字符串值作为 nameAttributeKey 而不是字符串值。

安全配置

    http.oauth2Login()
      .userInfoEndpoint()
        .customUserType(NaverOAuth2User.class, "naver");

NaverOAuth2用户

public class NaverOAuth2User implements OAuth2User {

   public NaverOAuth2User(Collection<? extends GrantedAuthority> authorities, Map<String, Object> attributes, String nameAttributeKey) {
           ...
   }

   ...

}

我希望调用 NaverOAuth2User 的构造函数,但在序列化之前导致错误。

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.rw.springsecurity.vo.NaverOAuth2User` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (PushbackInputStream); line: 1, column: 2]
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67) ~[jackson-databind-2.9.9.3.jar:2.9.9.3]
    at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1452) ~[jackson-databind-2.9.9.3.jar:2.9.9.3]
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1028) ~[jackson-databind-2.9.9.3.jar:2.9.9.3]
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1297) ~[jackson-databind-2.9.9.3.jar:2.9.9.3]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326) ~[jackson-databind-2.9.9.3.jar:2.9.9.3]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159) ~[jackson-databind-2.9.9.3.jar:2.9.9.3]
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4014) ~[jackson-databind-2.9.9.3.jar:2.9.9.3]
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3085) ~[jackson-databind-2.9.9.3.jar:2.9.9.3]
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:239) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]

我假设构造函数参数是错误的。

标签: javaspring-bootspring-security-oauth2

解决方案


在幕后 Spring Security 用于RestTemplate将来自 userInfo 端点的数据反序列化为我们指定的自定义类型,该类型需要具有默认构造函数

您可以在 中检查此逻辑org.springframework.security.oauth2.client.userinfo.CustomUserTypesOAuth2UserService


推荐阅读