diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java index 4ee78efdb..d8963ec73 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -1,7 +1,12 @@ package com.ruoyi.web.controller.common; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.aliyun.oss.common.auth.Credentials; +import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.config.properties.OSSProperties; import com.ruoyi.framework.oss.OSSClientWrapper; import com.ruoyi.web.controller.common.vo.STSCredentialsVO; @@ -9,10 +14,13 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.concurrent.TimeUnit; + /** * 通用请求处理 * @@ -27,20 +35,39 @@ public class CommonController { private OSSClientWrapper ossClient; @Autowired private OSSProperties ossProperties; + @Autowired + private RedisCache redisCache; + /** + * STS缓存时间(秒) + */ + @Value("${sts_cache_duration:1800}") + private Integer stsCacheDuration; @ApiOperation("获取OSS临时访问凭证") @GetMapping("/oss/getCredentials") public R getCredentials() { - STSCredentialsVO vo = new STSCredentialsVO(); + Long currentUserId = SecurityUtils.getUserId(); + if (currentUserId == null) { + return R.fail(); + } + String cacheStr = redisCache.getCacheObject(CacheConstants.USER_STS_KEY + currentUserId); + if (StrUtil.isNotBlank(cacheStr)) { + //有缓存直接返回 + return R.ok(JSONUtil.toBean(cacheStr, STSCredentialsVO.class)); + } Credentials credentials = ossClient.createStsCredentials(); + STSCredentialsVO vo = new STSCredentialsVO(); vo.setAccessKeyId(credentials.getAccessKeyId()); vo.setAccessKeySecret(credentials.getSecretAccessKey()); vo.setSecurityToken(credentials.getSecurityToken()); vo.setBucketName(ossProperties.getBucketName()); vo.setRegionId(ossProperties.getRegionId()); vo.setEndPoint(ossProperties.getEndPoint()); - vo.setExpiredDuration(ossProperties.getExpiredDuration()); + vo.setExpiredDuration(ossProperties.getExpiredDuration() - stsCacheDuration); vo.setHttpsFlag(ossProperties.isHttps()); + //缓存 + redisCache.setCacheObject(CacheConstants.USER_STS_KEY + currentUserId, JSONUtil.toJsonStr(vo), + stsCacheDuration, TimeUnit.SECONDS); return R.ok(vo); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java index c89692c29..1af61eb33 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -41,4 +41,9 @@ public class CacheConstants * 登录账户密码错误次数 redis key */ public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; + + /** + * 用户STS + */ + public static final String USER_STS_KEY = "user_sts:"; }