zhangf
2024-06-24 21362fd048558832cdcaca8ee957d2d7aa753be2
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
@@ -4,6 +4,11 @@
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import com.ruoyi.common.constant.ResultConstants;
import com.ruoyi.common.core.domain.model.InstitutionUser;
import com.ruoyi.common.exception.BusinessException;
import io.swagger.models.auth.In;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -45,11 +50,31 @@
    @Value("${token.expireTime}")
    private int expireTime;
    //三方头自定义标识
    @Value("${threeToken.header}")
    private String threeInHeader;
    //三方密钥
    @Value("${threeToken.secret}")
    private String threeInsecret;
    //三方token过期时间
    @Value("${threeToken.expireTime}")
    private int threeInExpireTime;
    protected static final long MILLIS_SECOND = 1000;
    protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
    protected static final long MILLIS_HOUR = 60 * MILLIS_MINUTE;
    protected static final long MILLIS_DAY = 24 * MILLIS_HOUR;
    private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
    @Autowired
    private RedisCache redisCache;
@@ -82,6 +107,7 @@
        return null;
    }
    /**
     * 设置用户身份信息
     */
@@ -92,6 +118,8 @@
            refreshToken(loginUser);
        }
    }
    /**
     * 删除用户身份信息
@@ -152,6 +180,8 @@
        String userKey = getTokenKey(loginUser.getToken());
        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
    }
    /**
     * 设置用户代理信息
@@ -228,4 +258,114 @@
    {
        return CacheConstants.LOGIN_TOKEN_KEY + uuid;
    }
    /**
     * 三方机构校验tokenKey
     * @param uuid
     * @return
     */
    private String getThreeInTokenKey(String uuid){
        return CacheConstants.THREE_INSTITUTION_TOKEN_KEY + uuid;
    }
    /**
     * 获取三方用户身份信息
     *
     * @return 用户信息
     */
    public InstitutionUser getThreeInUser(HttpServletRequest request)
    {
        // 获取请求携带的令牌
        String token = request.getHeader(threeInHeader);
        if (StringUtils.isNotEmpty(token))
        {
            try
            {
                // 解析对应的权限以及用户信息
                String userKey = getThreeInTokenKey(token);
                InstitutionUser institutionUser = redisCache.getCacheObject(userKey);
                return institutionUser;
            }
            catch (Exception e)
            {
                log.error("获取三方用户信息异常'{}'", e.getMessage());
            }
        } else {
            throw new BusinessException(ResultConstants.ACCESS_TOKEN_LOSE);
        }
        return null;
    }
    /**
     * 设置三方用户身份信息
     */
    public void setInstitutionUser(InstitutionUser institutionUser)
    {
        if (StringUtils.isNotNull(institutionUser) && StringUtils.isNotEmpty(institutionUser.getToken()))
        {
            refreshThreeInToken(institutionUser);
        }
    }
    /**
     * 刷新三方令牌有效期
     *
     * @param institutionUser 验证信息
     */
    public void refreshThreeInToken(InstitutionUser institutionUser)
    {
        // 根据uuid将机构缓存
        String userKey = getThreeInTokenKey(institutionUser.getToken());
        institutionUser.setExpireTime(System.currentTimeMillis() + threeInExpireTime * MILLIS_DAY);
        redisCache.setCacheObject(userKey, institutionUser, threeInExpireTime, TimeUnit.DAYS);
    }
    /**
     * 创建三方机构令牌
     *
     * @param institutionUser 用户信息
     * @return 令牌
     */
    public String createThreeInToken(InstitutionUser institutionUser)
    {
        String token = IdUtils.fastUUID();
        institutionUser.setToken(token);
        setThreeInAgent(institutionUser);
        refreshThreeInToken(institutionUser);
        return token;
    }
    /**
     * 设置用户代理信息
     *
     * @param institutionUser 登录信息
     */
    public void setThreeInAgent(InstitutionUser institutionUser)
    {
        UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
        String ip = IpUtils.getIpAddr();
        institutionUser.setIpaddr(ip);
        institutionUser.setLocation(AddressUtils.getRealAddressByIP(ip));
        institutionUser.setBrowser(userAgent.getBrowser().getName());
        institutionUser.setOs(userAgent.getOperatingSystem().getName());
    }
    /**
     * 验证令牌有效期,相差不足20分钟,自动刷新缓存
     *
     * @param institutionUser
     * @return
     */
    public void verifyThreeInToken(InstitutionUser institutionUser)
    {
        long expireTime = institutionUser.getExpireTime();
        long currentTime = System.currentTimeMillis();
        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
        {
            refreshThreeInToken(institutionUser);
        }
    }
}