package com.backendsys.modules.system.utils; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.backendsys.modules.common.config.redis.utils.RedisUtil; import com.backendsys.modules.common.config.security.entity.SecurityUserInfo; import com.backendsys.modules.common.config.security.utils.JwtUtil; import com.backendsys.modules.system.entity.SysUserInfo; import com.backendsys.modules.system.entity.TokenCatch; import com.backendsys.modules.system.service.SysCommonService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; @Component public class UserUtil { @Autowired private JwtUtil jwtUtil; @Autowired private RedisUtil redisUtil; @Autowired private SysCommonService sysCommonService; @Value("${REDIS_LOGIN_TOKEN_PREFIX}") private String REDIS_LOGIN_TOKEN_PREFIX; public static final long SEVEN_DAYS_MILLIS = 7L * 24 * 60 * 60 * 1000; /** * 实时更新缓存: 用户信息 */ public SysUserInfo syncUpdateUserCatch(SysUserInfo userInfo, Integer tokenDurationHours, Boolean isRemember) { // -- 重置过期时间 ----------------------------------- Integer durationHours = tokenDurationHours != null ? tokenDurationHours : Convert.toInt(SEVEN_DAYS_MILLIS / 3600000L); Long tokenDurationMilliseconds = getTokenDuration(isRemember); Date tokenExpiration = new Date((new Date()).getTime() + tokenDurationMilliseconds); userInfo.setToken_expiration(DateUtil.format(tokenExpiration, "yyyy-MM-dd HH:mm:ss")); // 生成 Token String lastLoginUuid = userInfo.getLast_login_uuid(); SecurityUserInfo securityUserInfo = JSONUtil.toBean(JSONUtil.parseObj(userInfo), SecurityUserInfo.class); String token = jwtUtil.createSystemJwtToken(securityUserInfo); userInfo.setToken(token); // [Redis] 将 Token 与 Permission 存入缓存 String tokenRedisKey = REDIS_LOGIN_TOKEN_PREFIX + lastLoginUuid; TokenCatch tokenCatch = new TokenCatch(token, userInfo.getPermission_ids()); redisUtil.setCacheObject(tokenRedisKey, JSONUtil.toJsonStr(tokenCatch), durationHours, TimeUnit.HOURS); System.out.println("syncUpdateUserCatch = " + userInfo); return userInfo; } /** * 获得登录过期时间 (毫秒) */ public Long getTokenDuration(Boolean isRemember) { System.out.println("isRemember = " + isRemember); // [系统配置] 系统用户默认登录过期时间(小时) Integer SYSTEM_USER_LOGIN_DURATION_DEFAULT = Convert.toInt(sysCommonService.getCommonByTag("SYSTEM_USER_LOGIN_DURATION_DEFAULT")); // 将小时转换为毫秒 Long DEFAULT_MILLISECONDS = SYSTEM_USER_LOGIN_DURATION_DEFAULT * DateUnit.HOUR.getMillis(); // 是否钩选 "7天免登录",否则按系统配置-默认过期时间 Long tokenDurationMilliseconds = isRemember ? SEVEN_DAYS_MILLIS : DEFAULT_MILLISECONDS; return tokenDurationMilliseconds; } }