From f49cf7738d6368ebdde2472c9f554fd1a28c772d Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Thu, 22 Jan 2026 15:26:53 +0800
Subject: [PATCH] 2026-01-22 zwy minio临时凭证改为http申请
---
ard-sample/src/main/java/com/ard/sample/config/DockConfiguration.java | 97 +++++++++++++++++++++++
ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java | 45 ++++++++--
ard-sample/src/main/java/com/ard/sample/utils/MinioStsUtils.java | 55 +++++++++++++
ard-admin/src/main/resources/application-daqing.yml | 9 ++
ard-admin/src/main/resources/application-prod.yml | 7 +
5 files changed, 200 insertions(+), 13 deletions(-)
diff --git a/ard-admin/src/main/resources/application-daqing.yml b/ard-admin/src/main/resources/application-daqing.yml
index 33ab44a..7844de3 100644
--- a/ard-admin/src/main/resources/application-daqing.yml
+++ b/ard-admin/src/main/resources/application-daqing.yml
@@ -87,5 +87,12 @@
# 机场单独用的oss配置,要http地址
dock:
+ enable: true
+ provider: minio
endpoint: http://192.168.10.103:9011
- bucket: dock
\ No newline at end of file
+ access-key: admin
+ secret-key: ard12345
+ bucket: dock
+ expire: 3600
+ region: us-east-1
+ object-dir-prefix: wayline
\ No newline at end of file
diff --git a/ard-admin/src/main/resources/application-prod.yml b/ard-admin/src/main/resources/application-prod.yml
index a53afbf..feeff77 100644
--- a/ard-admin/src/main/resources/application-prod.yml
+++ b/ard-admin/src/main/resources/application-prod.yml
@@ -85,5 +85,12 @@
object-dir-prefix: wayline
dock:
+ enable: true
+ provider: minio
endpoint: http://111.40.46.199:9011
+ access-key: admin
+ secret-key: ard12345
bucket: dock
+ expire: 3600
+ region: us-east-1
+ object-dir-prefix: wayline
\ No newline at end of file
diff --git a/ard-sample/src/main/java/com/ard/sample/config/DockConfiguration.java b/ard-sample/src/main/java/com/ard/sample/config/DockConfiguration.java
index 5591be0..05d0388 100644
--- a/ard-sample/src/main/java/com/ard/sample/config/DockConfiguration.java
+++ b/ard-sample/src/main/java/com/ard/sample/config/DockConfiguration.java
@@ -1,20 +1,113 @@
package com.ard.sample.config;
+import com.ard.oss.model.enums.OssTypeEnum;
+import io.minio.MinioClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "dock")
public class DockConfiguration {
+// public static String endpoint;
+//
+// public static String bucket;
+//
+// public void setEndpoint(String endpoint) {
+// DockConfiguration.endpoint = endpoint;
+// }
+//
+// public void setBucket(String bucket) {
+// DockConfiguration.bucket = bucket;
+// }
+ /**
+ * @see OssTypeEnum
+ */
+ public static String provider;
+
+ /**
+ * Whether to use the object storage service.
+ */
+ public static boolean enable;
+
+ /**
+ * The protocol needs to be included at the beginning of the address.
+ */
public static String endpoint;
+
+ public static String accessKey;
+
+ public static String secretKey;
+
+ public static String region;
+
+ public static Long expire;
+
+ public static String roleSessionName;
+
+ public static String roleArn;
public static String bucket;
- public void setEndpoint(String endpoint) {
- DockConfiguration.endpoint = endpoint;
+ public static String objectDirPrefix;
+
+ public void setProvider(String provider) {
+ DockConfiguration.provider = provider;
+ }
+
+ public void setEnable(boolean enable) {
+ DockConfiguration.enable = enable;
+ }
+
+ public void setEndpoint(String endpoint) { DockConfiguration.endpoint = endpoint; }
+
+ public void setAccessKey(String accessKey) {
+ DockConfiguration.accessKey = accessKey;
+ }
+
+ public void setSecretKey(String secretKey) {
+ DockConfiguration.secretKey = secretKey;
+ }
+
+ public void setRegion(String region) {
+ DockConfiguration.region = region;
+ }
+
+ public void setExpire(Long expire) {
+ DockConfiguration.expire = expire;
+ }
+
+ public void setRoleSessionName(String roleSessionName) {
+ DockConfiguration.roleSessionName = roleSessionName;
+ }
+
+ public void setRoleArn(String roleArn) {
+ DockConfiguration.roleArn = roleArn;
}
public void setBucket(String bucket) {
DockConfiguration.bucket = bucket;
}
+
+ public void setObjectDirPrefix(String objectDirPrefix) {
+ DockConfiguration.objectDirPrefix = objectDirPrefix;
+ }
+
+// /**
+// * 创建MinioClient Bean(核心:适配反向代理的HTTP地址)
+// */
+// @Bean
+// public MinioClient minioClient() {
+// // 方式1:通过endpoint重载方法(推荐,明确指定端口和是否HTTPS)
+// // 解析endpoint的协议、IP、端口
+// String[] endpointParts = endpoint.split("//")[1].split(":");
+// String host = endpointParts[0]; // 192.168.10.103
+// int port = Integer.parseInt(endpointParts[1]); // 9011
+// boolean isHttps = endpoint.startsWith("https"); // 反向代理是HTTP,故为false
+//
+// return MinioClient.builder()
+// .endpoint(host, port, isHttps) // 8.3.7核心:通过重载方法指定secure
+// .credentials(accessKey, secretKey)
+// .build();
+// }
}
diff --git a/ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java
index 11c0933..56607d4 100644
--- a/ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java
@@ -8,6 +8,7 @@
import com.ard.sample.config.DockConfiguration;
import com.ard.sample.storage.service.IStorageService;
import com.ard.oss.service.impl.OssServiceContext;
+import com.ard.sample.utils.MinioStsUtils;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.credentials.StaticProvider;
@@ -37,31 +38,53 @@
@Autowired
private OssServiceContext ossService;
+ @Autowired
+ private MinioStsUtils minioStsUtils;
@Override
public StsCredentialsDTO getSTSCredentials() {
- CredentialsDTO credentials = ossService.getCredentials();
+// CredentialsDTO credentials = ossService.getCredentials();
+ CredentialsDTO credentials = minioStsUtils.getCredentials();
+
//验证一下minio的临时凭证是否可用
- log.info("验证临时凭证是否有效:{}", credentials);
+ log.info("验证http临时凭证是否有效:{}", credentials);
execMinio(DockConfiguration.endpoint,
credentials.getAccessKeyId(),
credentials.getAccessKeySecret(),
credentials.getSecurityToken(),
+ OssConfiguration.region,
DockConfiguration.bucket,
- "test_object");
+ "test_object_http");
+
+// log.info("验证https临时凭证是否有效:{}", credentials);
+// execMinio(OssConfiguration.endpoint,
+// credentials.getAccessKeyId(),
+// credentials.getAccessKeySecret(),
+// credentials.getSecurityToken(),
+// OssConfiguration.region,
+// DockConfiguration.bucket,
+// "test_object_https");
return StsCredentialsDTO.builder()
//机场媒体库minio配置信息用代理地址,桶用机场的桶。
- //.endpoint(OssConfiguration.endpoint)
.endpoint(DockConfiguration.endpoint)
-// .bucket(OssConfiguration.bucket)
.bucket(DockConfiguration.bucket)
-// .credentials(ossService.getCredentials())
.credentials(credentials)
- .provider(OssConfiguration.provider)
- .objectKeyPrefix(OssConfiguration.objectDirPrefix)
- .region(OssConfiguration.region)
+ .provider(DockConfiguration.provider)
+ .objectKeyPrefix(DockConfiguration.objectDirPrefix)
+ .region(DockConfiguration.region)
.build();
+
+// return StsCredentialsDTO.builder()
+// //机场媒体库minio配置信息用代理地址,桶用机场的桶。
+// .endpoint(OssConfiguration.endpoint)
+// .bucket(OssConfiguration.bucket)
+//// .credentials(ossService.getCredentials())
+// .credentials(credentials)
+// .provider(OssConfiguration.provider)
+// .objectKeyPrefix(OssConfiguration.objectDirPrefix)
+// .region(OssConfiguration.region)
+// .build();
}
@Override
@@ -83,16 +106,18 @@
String accessKeyId,
String accessKeySecret,
String securityToken,
+ String region,
String bucketName,
String testObjectName) {
// 1. 替换为你要验证的临时凭证参数(从 getCredentials() 返回的结果中复制)
try {
+ log.info("🔑 正在验证{}临时凭证有效性...", endpoint);
// 2. 用临时凭证(含 securityToken)初始化 MinIO 客户端
MinioClient minioClient = MinioClient.builder()
.endpoint(endpoint)
// .credentials(accessKeyId, accessKeySecret) // 核心:传入 securityToken
.credentialsProvider(new StaticProvider(accessKeyId, accessKeySecret, securityToken))
- .region("us-east-1") // 和你配置的 region 一致
+ .region(region) // 和你配置的 region 一致 us-east-1
.build();
// 3. 执行验证操作:上传一个测试文件(模拟机场上传媒体文件)
diff --git a/ard-sample/src/main/java/com/ard/sample/utils/MinioStsUtils.java b/ard-sample/src/main/java/com/ard/sample/utils/MinioStsUtils.java
new file mode 100644
index 0000000..bea7e67
--- /dev/null
+++ b/ard-sample/src/main/java/com/ard/sample/utils/MinioStsUtils.java
@@ -0,0 +1,55 @@
+package com.ard.sample.utils;
+
+import com.ard.oss.model.CredentialsDTO;
+import io.minio.credentials.AssumeRoleProvider;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.ConnectionPool;
+import okhttp3.OkHttpClient;
+import org.springframework.stereotype.Component;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.ProviderException;
+import java.util.concurrent.TimeUnit;
+
+import static com.ard.sample.config.DockConfiguration.*;
+
+/**
+ * 获取http的STS凭证的工具类,用于简化STS临时凭证的获取过程。
+ */
+@Slf4j
+@Component
+public class MinioStsUtils {
+
+ public CredentialsDTO getCredentials() {
+ try {
+ // 构建适配HTTP协议的OkHttpClient(移除所有SSL相关配置)
+ OkHttpClient httpClient = new OkHttpClient.Builder()
+ // 保留原代码的连接池配置(禁用连接复用,如需复用可删除此行)
+ .connectionPool(new ConnectionPool(0, 1, TimeUnit.SECONDS))
+ .build();
+
+ // 构建 AssumeRoleProvider,使用简化后的HTTP客户端
+ AssumeRoleProvider provider = new AssumeRoleProvider(
+ endpoint, // 注意:此处endpoint需改为HTTP地址(如 http://sts.example.com)
+ accessKey, // 主账号AccessKey
+ secretKey, // 主账号SecretKey
+ Math.toIntExact(expire), // 凭证过期时间(转int)
+ null, // 可选参数(如RoleArn,根据实际SDK调整)
+ region, // 地域(如cn-hangzhou)
+ null, null, null, // 其他可选参数
+ httpClient // 传入HTTP版本的OkHttpClient
+ );
+
+ // 获取 STS 临时凭证
+ var stsCredentials = provider.fetch();
+ return new CredentialsDTO(stsCredentials, expire);
+
+ } catch (ProviderException e) {
+ log.error("Failed to fetch/parse STS response (HTTP access)", e);
+ throw new RuntimeException("STS response parse failed", e);
+ } catch (NoSuchAlgorithmException e) {
+ log.error("Failed to fetch/parse STS response (HTTP access)", e);
+ throw new RuntimeException(e);
+ }
+ }
+}
\ No newline at end of file
--
Gitblit v1.9.3