From 989d9ebe56ba4c142747433b21d8f874ae7d97f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=AE=87=E5=A5=87?= Date: Fri, 28 Mar 2025 13:56:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:sts=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/common/CommonController.java | 31 +++++++++++++++++-- .../ruoyi/common/constant/CacheConstants.java | 5 +++ 2 files changed, 34 insertions(+), 2 deletions(-) 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:"; }