java - 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]
我假设构造函数参数是错误的。
解决方案
在幕后 Spring Security 用于RestTemplate
将来自 userInfo 端点的数据反序列化为我们指定的自定义类型,该类型需要具有默认构造函数。
您可以在 中检查此逻辑org.springframework.security.oauth2.client.userinfo.CustomUserTypesOAuth2UserService
。
推荐阅读
- rust - 如何将 wasm 特定的宏与函数和结构分离
- azure-devops - Databricks API 2.0 - 无法使用 SPN 凭据创建 KEYVAULT 机密范围
- qt - 如何创建能够嵌套其他组件的组件
- github - GitHub 工作流程中的条件运行步骤
- node.js - package.json - 禁止在包源中使用某些文件名
- python - 将从 API 接收到的 png 格式文本转换为 png 文件 - python
- opencv - OpenCV:如何使灰色文本变暗?
- excel - 从工作簿导入数据并更改范围
- excel - 禁用在 Power Query 刷新时选择查询表
- .net - 是否可以在只有 4.6 .Net Framework 的系统上使用 .Net Framework 4.8 启动应用程序?