diff --git a/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/AuthRedisTokenStore.java b/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/AuthRedisTokenStore.java index ec4f3111f81cd23d9c267e63b2f7b7955608a1ea..8d5094c3f137c2be85d5b11b4a3f44b680a35a1b 100644 --- a/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/AuthRedisTokenStore.java +++ b/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/AuthRedisTokenStore.java @@ -21,7 +21,7 @@ import org.springframework.security.oauth2.provider.token.TokenStore; @ConditionalOnProperty(prefix = "zlt.oauth2.token.store", name = "type", havingValue = "redis", matchIfMissing = true) public class AuthRedisTokenStore { @Bean - public TokenStore tokenStore(RedisConnectionFactory connectionFactory, SecurityProperties securityProperties) { - return new CustomRedisTokenStore(connectionFactory, securityProperties); + public TokenStore tokenStore(RedisConnectionFactory connectionFactory, SecurityProperties securityProperties, RedisSerializer redisValueSerializer) { + return new CustomRedisTokenStore(connectionFactory, securityProperties, redisValueSerializer); } } diff --git a/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/CustomRedisTokenStore.java b/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/CustomRedisTokenStore.java index ec1eba196fef4f632a4dc6ee3195126de2240b24..ad35a6fff4f34966398a2389d3a5ef45dea935aa 100644 --- a/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/CustomRedisTokenStore.java +++ b/zlt-commons/zlt-auth-client-spring-boot-starter/src/main/java/com/central/oauth2/common/store/CustomRedisTokenStore.java @@ -4,6 +4,7 @@ import com.central.common.constant.SecurityConstants; import com.central.oauth2.common.properties.SecurityProperties; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; import org.springframework.security.oauth2.common.ExpiringOAuth2RefreshToken; import org.springframework.security.oauth2.common.OAuth2AccessToken; @@ -61,9 +62,15 @@ public class CustomRedisTokenStore implements TokenStore { */ private SecurityProperties securityProperties; - public CustomRedisTokenStore(RedisConnectionFactory connectionFactory, SecurityProperties securityProperties) { + /** + * 业务redis的value序列化 + */ + private RedisSerializer redisValueSerializer; + + public CustomRedisTokenStore(RedisConnectionFactory connectionFactory, SecurityProperties securityProperties, RedisSerializer redisValueSerializer) { this.connectionFactory = connectionFactory; this.securityProperties = securityProperties; + this.redisValueSerializer = redisValueSerializer; if (springDataRedis_2_0) { this.loadRedisConnectionMethods_2_0(); } @@ -111,7 +118,7 @@ public class CustomRedisTokenStore implements TokenStore { } private ClientDetails deserializeClientDetails(byte[] bytes) { - return serializationStrategy.deserialize(bytes, ClientDetails.class); + return (ClientDetails)redisValueSerializer.deserialize(bytes); } private byte[] serialize(String string) { diff --git a/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/RedisAutoConfigure.java b/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/RedisAutoConfigure.java index 33b755f25e20294e1ebc062839b92751d51d180d..6f25cec7a2323a2c6260000659ec97cc2fe92e3c 100644 --- a/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/RedisAutoConfigure.java +++ b/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/RedisAutoConfigure.java @@ -41,7 +41,7 @@ public class RedisAutoConfigure { @Bean public RedisSerializer redisValueSerializer() { - return RedisSerializer.java(); + return RedisSerializer.json(); } /** diff --git a/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/template/RedisRepository.java b/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/template/RedisRepository.java index 3770878f93f3a4cf877747d8e3eb8a51326a5ca9..d083ece6fd85696ff8932af0d8be40a44802762f 100644 --- a/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/template/RedisRepository.java +++ b/zlt-commons/zlt-redis-spring-boot-starter/src/main/java/com/central/common/redis/template/RedisRepository.java @@ -8,6 +8,9 @@ import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.ListOperations; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationUtils; +import org.springframework.util.Assert; import java.util.*; import java.util.concurrent.TimeUnit; @@ -146,6 +149,17 @@ public class RedisRepository { public Object get(final String key) { return redisTemplate.opsForValue().get(key); } + /** + * 根据key获取对象 + * + * @param key the key + * @param valueSerializer 序列化 + * @return the string + */ + public Object get(final String key, RedisSerializer valueSerializer) { + byte[] rawKey = rawKey(key); + return redisTemplate.execute(connection -> deserializeValue(connection.get(rawKey), valueSerializer), true); + } /** * Ops for hash hash operations. @@ -361,6 +375,20 @@ public class RedisRepository { return opsForList().range(key, start, end); } + /** + * redis List数据结构 : 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 end 指定。 + * + * @param key the key + * @param start the start + * @param end the end + * @param valueSerializer 序列化 + * @return the list + */ + public List getList(String key, int start, int end, RedisSerializer valueSerializer) { + byte[] rawKey = rawKey(key); + return redisTemplate.execute(connection -> deserializeValues(connection.lRange(rawKey, start, end), valueSerializer), true); + } + /** * redis List数据结构 : 批量存储 * @@ -382,4 +410,28 @@ public class RedisRepository { public void insert(String key, long index, Object value) { opsForList().set(key, index, value); } + + private byte[] rawKey(Object key) { + Assert.notNull(key, "non null key required"); + + if (key instanceof byte[]) { + return (byte[]) key; + } + RedisSerializer redisSerializer = (RedisSerializer)redisTemplate.getKeySerializer(); + return redisSerializer.serialize(key); + } + + private List deserializeValues(List rawValues, RedisSerializer valueSerializer) { + if (valueSerializer == null) { + return rawValues; + } + return SerializationUtils.deserialize(rawValues, valueSerializer); + } + + private Object deserializeValue(byte[] value, RedisSerializer valueSerializer) { + if (valueSerializer == null) { + return value; + } + return valueSerializer.deserialize(value); + } } diff --git a/zlt-uaa/src/main/java/com/central/oauth/service/impl/RedisTokensServiceImpl.java b/zlt-uaa/src/main/java/com/central/oauth/service/impl/RedisTokensServiceImpl.java index 8a6c81b089194b43be655453a722724c1c51a343..9aa95426986f09c136fce13cb41f74b433d7f6b3 100644 --- a/zlt-uaa/src/main/java/com/central/oauth/service/impl/RedisTokensServiceImpl.java +++ b/zlt-uaa/src/main/java/com/central/oauth/service/impl/RedisTokensServiceImpl.java @@ -10,6 +10,7 @@ import com.central.oauth.service.ITokensService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.OAuth2Request; @@ -40,8 +41,10 @@ public class RedisTokensServiceImpl implements ITokensService { String redisKey = getRedisKey(params, clientId); long size = redisRepository.length(redisKey); List result = new ArrayList<>(limit); + RedisSerializer valueSerializer = RedisSerializer.java(); //查询token集合 - List tokenObjs = redisRepository.getList(redisKey, startEnds[0], startEnds[1]-1); + //redisRepository.getRedisTemplate().e + List tokenObjs = redisRepository.getList(redisKey, startEnds[0], startEnds[1]-1, valueSerializer); if (tokenObjs != null) { for (Object obj : tokenObjs) { DefaultOAuth2AccessToken accessToken = (DefaultOAuth2AccessToken)obj; @@ -51,7 +54,7 @@ public class RedisTokensServiceImpl implements ITokensService { tokenVo.setExpiration(accessToken.getExpiration()); //获取用户信息 - Object authObj = redisRepository.get(SecurityConstants.REDIS_TOKEN_AUTH + accessToken.getValue()); + Object authObj = redisRepository.get(SecurityConstants.REDIS_TOKEN_AUTH + accessToken.getValue(), valueSerializer); OAuth2Authentication authentication = (OAuth2Authentication)authObj; if (authentication != null) { OAuth2Request request = authentication.getOAuth2Request();