我尝试重写一些旧代码,使用org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore
来存储访问令牌。我现在尝试使用RedisTokenStore
来代替以前使用的InMemoryTokenStore
。令牌被生成并存储在Redis fine(独立的Redis配置)中,但是,OAuth2Authentication
的反序列化失败,并出现以下错误:
Could not read JSON: Cannot construct instance of `org.springframework.security.oauth2.provider.OAuth2Authentication` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
由于这个类没有默认的构造函数,所以在Redis中查找时,反序列化和Map到实际对象的操作会失败。
RedisTokenStore redisTokenStore = new RedisTokenStore(jedisConnectionFactory);
redisTokenStore.setSerializationStrategy(new StandardStringSerializationStrategy() {
@Override
protected <T> T deserializeInternal(byte[] bytes, Class<T> aClass) {
return Utilities.parse(new String(bytes, StandardCharsets.UTF_8),aClass);
}
@Override
protected byte[] serializeInternal(Object o) {
return Objects.requireNonNull(Utilities.convert(o)).getBytes();
}
});
this.tokenStore = redisTokenStore;
public static <T> T parse(String json, Class<T> clazz) {
try {
return OBJECT_MAPPER.readValue(json, clazz);
} catch (IOException e) {
log.error("Jackson2Json failed: " + e.getMessage());
} return null;}
public static String convert(Object data) {
try {
return OBJECT_MAPPER.writeValueAsString(data);
} catch (JsonProcessingException e) {
log.error("Conversion failed: " + e.getMessage());
}
return null;
}
OAuth2Authentication对象是如何在Redis中重新构造的?因为它没有定义默认的构造函数,所以任何基于Jackson的序列化器和对象Map器都不能反序列化它。
同样,序列化工作得很好(因为OAuth2Authentication
实现了Serializable接口),令牌在Redis中存储得很好,只是在调用/oauth/check_token
时失败。
我遗漏了什么,在Redis中存储访问令牌时如何处理这个问题?
1条答案
按热度按时间rryofs0p1#
我通过编写自定义反序列化程序解决了这个问题。它看起来像这样:
然后,我在objectMapper中注册了反序列化器,稍后jacksonAPI将使用它