| Pass |
- 17:18:30 |
+ 22:27:44 |
Test passed
|
@@ -128,13 +128,13 @@
Started
-
三月 26, 2025 17:18:30
+
三月 31, 2025 22:27:43
Ended
-
三月 26, 2025 17:18:30
+
三月 31, 2025 22:27:44
diff --git a/hiver-core/src/main/java/cc/hiver/core/common/utils/SecurityUtil.java b/hiver-core/src/main/java/cc/hiver/core/common/utils/SecurityUtil.java
index c3deb130..8af8ee37 100644
--- a/hiver-core/src/main/java/cc/hiver/core/common/utils/SecurityUtil.java
+++ b/hiver-core/src/main/java/cc/hiver/core/common/utils/SecurityUtil.java
@@ -23,12 +23,14 @@ import cc.hiver.core.vo.PermissionDTO;
import cc.hiver.core.vo.RoleDTO;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.IdUtil;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
@@ -38,10 +40,7 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.LinkedHashSet;
-import java.util.List;
+import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -77,7 +76,10 @@ public class SecurityUtil {
private MemberDao memberDao;
@Autowired
- private RedisTemplateHelper redisTemplate;
+ private RedisTemplateHelper redisTemplateHelper;
+
+ @Autowired
+ private RedisTemplate redisTemplate;
@Autowired
private WorkerDao workerDao;
@@ -88,6 +90,9 @@ public class SecurityUtil {
@Autowired
private LogisticsUserService logisticsUserService;
+ @Autowired
+ private ObjectMapper objectMapper;
+
/**
* -------------------ToB-------------------------
*/
@@ -95,7 +100,7 @@ public class SecurityUtil {
public User findUserByUsername(String username) {
final String key = "username::" + username;
// 璇诲彇缂撳瓨
- final String res = redisTemplate.get(key);
+ final String res = redisTemplateHelper.get(key);
if (CharSequenceUtil.isNotBlank(res)) {
final Gson oldUser = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create();
return userToDTO(oldUser.fromJson(res, User.class));
@@ -103,30 +108,34 @@ public class SecurityUtil {
final User user = userToDTO(userDao.findByUsername(username));
// 缂撳瓨
final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create();
- redisTemplate.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
return user;
}
public Worker findWorkerByUsername(String username) {
final String key = "workername::" + username;
// 璇诲彇缂撳瓨
- final String res = redisTemplate.get(key);
+ final String res = redisTemplateHelper.get(key);
if (CharSequenceUtil.isNotBlank(res)) {
return new Gson().fromJson(res, Worker.class);
}
final Worker worker = workerDao.findByUsername(username);
// 缂撳瓨
- redisTemplate.set(key, new Gson().toJson(worker), 15L, TimeUnit.DAYS);
+ redisTemplateHelper.set(key, new Gson().toJson(worker), 15L, TimeUnit.DAYS);
return worker;
}
public LogiticsCompany findCompanyByUsername(String username) {
final String key = "companyName::" + username;
- // 璇诲彇缂撳瓨
- final String res = redisTemplate.get(key);
- if (CharSequenceUtil.isNotBlank(res)) {
- return new Gson().fromJson(res, LogiticsCompany.class);
- }
+ // 鐩存帴浣跨敤 RedisTemplate 鑾峰彇瀵硅薄锛屼笉瑕佹墜鍔ㄥ弽搴忓垪鍖
+ Object value = redisTemplate.opsForValue().get(key);
+ if (value instanceof LinkedHashMap) {
+ return objectMapper.convertValue(value, LogiticsCompany.class);
+ }
+ /*LogiticsCompany company = (LogiticsCompany) redisTemplate.opsForValue().get(key);
+ if (company != null) {
+ return company;
+ }*/
LogiticsCompany logiticsCompany = logiticsCompanyDao.findByUsername(username);
// 濡傛灉娌℃湁鑾峰彇鍒帮紝閭d箞鍘绘悳绱㈠叕鍙稿憳宸ヤ俊鎭
if (logiticsCompany == null ) {
@@ -145,7 +154,8 @@ public class SecurityUtil {
}
}
// 缂撳瓨
- redisTemplate.set(key, new Gson().toJson(logiticsCompany), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ // redisTemplate.set(key, logiticsCompany, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ redisTemplate.opsForValue().set(key, logiticsCompany, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
return logiticsCompany;
}
@@ -294,41 +304,41 @@ public class SecurityUtil {
tokenUser = new TokenUser(user, tokenProperties.getStorePerms(), saved);
// 鍗曡澶囩櫥褰 涔嬪墠鐨則oken澶辨晥
if (tokenProperties.getSdl()) {
- final String oldToken = redisTemplate.get(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType());
+ final String oldToken = redisTemplateHelper.get(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType());
if (CharSequenceUtil.isNotBlank(oldToken)) {
- redisTemplate.delete(SecurityConstant.TOKEN_PRE + oldToken);
+ redisTemplateHelper.delete(SecurityConstant.TOKEN_PRE + oldToken);
final String userTokenKey = SecurityConstant.TOKEN_PRE + oldToken;
final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + oldToken + "type:";
- redisTemplate.delete(userTokenKey);
- redisTemplate.delete(userTypeKey);
+ redisTemplateHelper.delete(userTokenKey);
+ redisTemplateHelper.delete(userTypeKey);
// 搴楅摵鍙婂晢鍦
final String shopIdKey = SecurityConstant.TOKEN_SHOP_ID + oldToken + "shopId:";
final String regionKey = SecurityConstant.TOKEN_REGION + oldToken + "region:";
- redisTemplate.delete(shopIdKey);
- redisTemplate.delete(regionKey);
+ redisTemplateHelper.delete(shopIdKey);
+ redisTemplateHelper.delete(regionKey);
}
}
// 鏄惁璁颁綇璐﹀彿/淇濆瓨鐧诲綍
if (saved) {
- redisTemplate.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
- redisTemplate.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
// 淇濆瓨褰撳墠鐧诲綍鐢ㄦ埛鐨勮鑹
final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + token + "type:";
// 缂撳瓨
- redisTemplate.set(userTypeKey, user.getType(), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(userTypeKey, user.getType(), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
} else {
- redisTemplate.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES);
- redisTemplate.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES);
+ redisTemplateHelper.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES);
+ redisTemplateHelper.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES);
// 淇濆瓨褰撳墠鐧诲綍鐢ㄦ埛鐨勮鑹
final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + token + "type:";
// 缂撳瓨
- redisTemplate.set(userTypeKey, user.getType(), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES);
+ redisTemplateHelper.set(userTypeKey, user.getType(), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES);
}
// 鏇存柊褰撳墠鐧诲綍浜虹殑瑙掕壊
final String key = "username::" + user.getUsername();
final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create();
- redisTemplate.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
} else {
// JWT 涓嶇紦瀛樻潈闄 閬垮厤JWT闀垮害杩囬暱
tokenUser = new TokenUser(user, false, null);
@@ -378,8 +388,8 @@ public class SecurityUtil {
public LogiticsCompany getCurrCompany() {
final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
- boolean authenticated = authentication.isAuthenticated();
- String name = authentication.getName();
+ final boolean authenticated = authentication.isAuthenticated();
+ final String name = authentication.getName();
if (authentication == null || !authentication.isAuthenticated() || authentication.getName() == null
|| authentication instanceof AnonymousAuthenticationToken) {
throw new HiverException("鏈娴嬪埌鐧诲綍鐢ㄦ埛");
@@ -427,7 +437,7 @@ public class SecurityUtil {
final User u = getCurrUserSimple();
// 璇诲彇缂撳瓨
final String key = "userRole::depIds:" + u.getId();
- final String v = redisTemplate.get(key);
+ final String v = redisTemplateHelper.get(key);
if (CharSequenceUtil.isNotBlank(v)) {
deparmentIds = new Gson().fromJson(v, new TypeToken>() {
}.getType());
@@ -487,7 +497,7 @@ public class SecurityUtil {
deparmentIds.clear();
deparmentIds.addAll(set);
// 缂撳瓨
- redisTemplate.set(key, new Gson().toJson(deparmentIds), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(key, new Gson().toJson(deparmentIds), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
return deparmentIds;
}
@@ -532,13 +542,13 @@ public class SecurityUtil {
public Member findMemberByMobile(String mobile) {
final String key = "member::" + mobile;
// 璇诲彇缂撳瓨
- final String res = redisTemplate.get(key);
+ final String res = redisTemplateHelper.get(key);
if (CharSequenceUtil.isNotBlank(res)) {
return new Gson().fromJson(res, Member.class);
}
final Member member = memberDao.findByMobile(mobile);
// 缂撳瓨
- redisTemplate.set(key, new Gson().toJson(member), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(key, new Gson().toJson(member), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
return member;
}
@@ -567,13 +577,13 @@ public class SecurityUtil {
final String key = SecurityConstant.MEMBER_TOKEN + tokenMember.getUsername() + ':' + platform;
// 鍗曞钩鍙扮櫥褰 涔嬪墠鐨則oken澶辨晥
if (appTokenProperties.getSpl()) {
- final String oldToken = redisTemplate.get(key);
+ final String oldToken = redisTemplateHelper.get(key);
if (CharSequenceUtil.isNotBlank(oldToken)) {
- redisTemplate.delete(SecurityConstant.TOKEN_MEMBER_PRE + oldToken);
+ redisTemplateHelper.delete(SecurityConstant.TOKEN_MEMBER_PRE + oldToken);
}
}
- redisTemplate.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
- redisTemplate.set(SecurityConstant.TOKEN_MEMBER_PRE + token, new Gson().toJson(tokenMember), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(SecurityConstant.TOKEN_MEMBER_PRE + token, new Gson().toJson(tokenMember), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
} else {
// JWT
tokenMember = new TokenMember(member, platform);
@@ -651,13 +661,13 @@ public class SecurityUtil {
final String key = SecurityConstant.WORKER_TOKEN + tokenWorker.getWorkerId() + ':' + tokenWorker.getWorkerName();
// 鍗曞钩鍙扮櫥褰 涔嬪墠鐨則oken澶辨晥
if (appTokenProperties.getSpl()) {
- final String oldToken = redisTemplate.get(key);
+ final String oldToken = redisTemplateHelper.get(key);
if (CharSequenceUtil.isNotBlank(oldToken)) {
- redisTemplate.delete(SecurityConstant.TOKEN_WORKER_PRE + oldToken);
+ redisTemplateHelper.delete(SecurityConstant.TOKEN_WORKER_PRE + oldToken);
}
}
- redisTemplate.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
- redisTemplate.set(SecurityConstant.TOKEN_WORKER_PRE + token, new Gson().toJson(tokenWorker), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(SecurityConstant.TOKEN_WORKER_PRE + token, new Gson().toJson(tokenWorker), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
} else {
// JWT
tokenWorker = new TokenWorker(worker, saved);
@@ -719,13 +729,13 @@ public class SecurityUtil {
final String key = SecurityConstant.COMPANY_TOKEN + tokenCompany.getId() + ':' + tokenCompany.getCompanyName();
// 鍗曞钩鍙扮櫥褰 涔嬪墠鐨則oken澶辨晥
if (appTokenProperties.getSpl()) {
- final String oldToken = redisTemplate.get(key);
+ final String oldToken = redisTemplateHelper.get(key);
if (CharSequenceUtil.isNotBlank(oldToken)) {
- redisTemplate.delete(SecurityConstant.TOKEN_COMPANY_PRE + oldToken);
+ redisTemplateHelper.delete(SecurityConstant.TOKEN_COMPANY_PRE + oldToken);
}
}
- redisTemplate.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
- redisTemplate.set(SecurityConstant.TOKEN_COMPANY_PRE + token, new Gson().toJson(tokenCompany), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(SecurityConstant.TOKEN_COMPANY_PRE + token, new Gson().toJson(tokenCompany), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS);
} else {
// JWT
tokenCompany = new TokenCompany(logiticsCompany, saved);
@@ -756,13 +766,13 @@ public class SecurityUtil {
public User findByUserNameAndType(String username, String type) {
final String key = "username::" + username + "type:" + type;
// 璇诲彇缂撳瓨
- final String res = redisTemplate.get(key);
+ final String res = redisTemplateHelper.get(key);
if (CharSequenceUtil.isNotBlank(res)) {
return userToDTO(new Gson().fromJson(res, User.class));
}
final User user = userToDTO(userDao.findByUserNameAndType(username, type));
// 缂撳瓨
- redisTemplate.set(key, new Gson().toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(key, new Gson().toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
return user;
}
@@ -770,8 +780,8 @@ public class SecurityUtil {
final String shopIdKey = SecurityConstant.TOKEN_SHOP_ID + token + "shopId:";
final String regionKey = SecurityConstant.TOKEN_REGION + token + "region:";
// 缂撳瓨
- redisTemplate.set(shopIdKey, shopId, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
- redisTemplate.set(regionKey, region, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(shopIdKey, shopId, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
+ redisTemplateHelper.set(regionKey, region, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
}
public String getShopId() {
@@ -779,9 +789,9 @@ public class SecurityUtil {
// 鑾峰彇璇锋眰token
// 浠庣紦瀛樹腑鑾峰彇褰撳墠鐢ㄦ埛鐨剆hopId
final String tokenKey = SecurityConstant.USER_TOKEN + u.getUsername() + "type:" + u.getType();
- final String token = redisTemplate.get(tokenKey);
+ final String token = redisTemplateHelper.get(tokenKey);
final String shopIdKey = SecurityConstant.TOKEN_SHOP_ID + token + "shopId:";
- final String shopId = redisTemplate.get(shopIdKey);
+ final String shopId = redisTemplateHelper.get(shopIdKey);
return shopId;
}
@@ -790,16 +800,16 @@ public class SecurityUtil {
// 鑾峰彇璇锋眰token
// 浠庣紦瀛樹腑鑾峰彇褰撳墠鐢ㄦ埛鐨剆hopId
final String tokenKey = SecurityConstant.USER_TOKEN + u.getUsername() + "type:" + u.getType();
- final String token = redisTemplate.get(tokenKey);
+ final String token = redisTemplateHelper.get(tokenKey);
final String regionKey = SecurityConstant.TOKEN_REGION + token + "region:";
- final String region = redisTemplate.get(regionKey);
+ final String region = redisTemplateHelper.get(regionKey);
return region;
}
public String getLoginUserType(String token) {
// 淇濆瓨褰撳墠鐧诲綍鐢ㄦ埛鐨勮鑹
final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + token + "type:";
- final String userType = redisTemplate.get(userTypeKey);
+ final String userType = redisTemplateHelper.get(userTypeKey);
return userType;
}
}
diff --git a/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java b/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java
index d7a207e0..bc5af36c 100644
--- a/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java
+++ b/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java
@@ -3,6 +3,8 @@ package cc.hiver.core.config.cache;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.Cache;
@@ -14,82 +16,140 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
+import java.text.SimpleDateFormat;
import java.time.Duration;
+import java.util.TimeZone;
/**
- * Redis缂撳瓨
- *
- * @author Yazhi Li
+ * Redis缂撳瓨閰嶇疆
+ * 浼樺寲鍐呭锛
+ * 1. 瀹屽杽鏃ユ湡搴忓垪鍖栧鐞
+ * 2. 浼樺寲娉涘瀷浣跨敤
+ * 3. 澧炲己寮傚父澶勭悊
+ * 4. 鏀硅繘浠g爜鍙鎬
*/
@Slf4j
@Configuration
public class RedisCacheConfig extends CachingConfigurerSupport {
+
+ private static final String CACHE_ERROR_PREFIX = "Redis缂撳瓨鎿嶄綔寮傚父 - ";
+
@Value("${hiver.cache.timeToLive:-1}")
private Duration timeToLive;
/**
- * 鑷畾涔夊簭鍒楀寲鏂瑰紡
- *
- * @param factory
- * @return
+ * 鑷畾涔夌紦瀛樼鐞嗗櫒
+ * 浼樺寲鐐癸細
+ * 1. 浣跨敤娉涘瀷鏄庣‘鎸囧畾搴忓垪鍖栫被鍨
+ * 2. 閰嶇疆瀹屾暣鐨凧ackson搴忓垪鍖栬鍒
+ * 3. 鏀寔Java8鏃ユ湡鏃堕棿绫诲瀷
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
- RedisSerializer redisSerializer = new StringRedisSerializer();
- Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+ // Key搴忓垪鍖栧櫒
+ RedisSerializer keySerializer = new StringRedisSerializer();
- // 瑙e喅鏌ヨ缂撳瓨杞崲寮傚父鐨勯棶棰
- ObjectMapper om = new ObjectMapper();
- om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
- om.activateDefaultTyping(new ObjectMapper().getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
- jackson2JsonRedisSerializer.setObjectMapper(om);
+ // Value搴忓垪鍖栧櫒
+ Jackson2JsonRedisSerializer