SAS-Redis-Core-Service
一、怎么使用Spring Data Redis实现Spring Authorization Server的核心services?
本文对应的是文档中的How-to: Implement core services with JPA,文档中使用Jpa实现了核心的三个服务类:授权信息、客户端信息和授权确认的服务;
本文会使用Spring Data Redis参考文档来添加新的实现。在这里也放一下文档 中的一句话: 本指南的目的是为您自己实现这些服务提供一个起点,以便您可以根据自己的需要进行修改。
二、修改RedisConfig类 重要
添加注解@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP),在启动后添加Redis数据失效时间,自动删除@Indexed注解生成的索引(Secondary Indexes)。
package com.example.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisKeyValueAdapter;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.security.jackson2.CoreJackson2Module;
/**
* Redis的key序列化配置类
*
* @author vains
*/
@Configuration
@RequiredArgsConstructor
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
public class RedisConfig {
private final Jackson2ObjectMapperBuilder builder;
/**
* 默认情况下使用
*
* @param connectionFactory redis链接工厂
* @return RedisTemplate
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
// 字符串序列化器
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// 创建ObjectMapper并添加默认配置
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
// 序列化所有字段
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 此项必须配置,否则如果序列化的对象里边还有对象,会报如下错误:
// java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX
objectMapper.activateDefaultTyping(
objectMapper.getPolymorphicTypeValidator(),
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.PROPERTY);
// 添加Security提供的Jackson Mixin
objectMapper.registerModule(new CoreJackson2Module());
// 存入redis时序列化值的序列化器
Jackson2JsonRedisSerializer<Object> valueSerializer =
new Jackson2JsonRedisSerializer<>(objectMapper, Object.class);
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
// 设置值序列化
redisTemplate.setValueSerializer(valueSerializer);
// 设置hash格式数据值的序列化器
redisTemplate.setHashValueSerializer(valueSerializer);
// 默认的Key序列化器为:JdkSerializationRedisSerializer
redisTemplate.setKeySerializer(stringRedisSerializer);
// 设置字符串序列化器
redisTemplate.setStringSerializer(stringRedisSerializer);
// 设置hash结构的key的序列化器
redisTemplate.setHashKeySerializer(stringRedisSerializer);
// 设置连接工厂
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}