基于S3协议对外分享文件权限管理方案
本篇文章以MinIO作为文件服务端,其他基于S3协议的文件服务也一样。
通过接口返回文件地址给前端时,可以结合 S3 的预签名 URL 或 STS(临时凭证) 来实现安全访问。
核心思路
- 接口返回的文件地址不直接暴露 MinIO 存储路径。
- 在返回文件地址前,通过后端生成 预签名 URL 或 动态临时凭证。
- 前端使用该地址访问文件,确保文件访问受到权限和时间限制。
实现方法 1:基于预签名 URL
1.1 后端生成预签名 URL
使用 MinIO 提供的 SDK,在接口中动态生成带有时间限制的预签名 URL,并返回给前端。
Java 示例代码:
import io.minio.MinioClient;
import io.minio.GetPresignedObjectUrlArgs;
import io.minio.http.Method;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FileController {
private final MinioClient minioClient;
public FileController() {
this.minioClient = MinioClient.builder()
.endpoint("https://your-minio-server.com")
.credentials("ACCESS_KEY", "SECRET_KEY")
.build();
}
@GetMapping("/api/getFileUrl")
public String getFileUrl(@RequestParam String bucketName, @RequestParam String objectName) {
try {
// 生成预签名 URL(有效期 1 小时)
String url = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(objectName)
.expiry(60 * 60) // 有效期:1小时
.build()
);
return url;
} catch (Exception e) {
e.printStackTrace();
return "Error generating URL";
}
}
}1.2 接口返回示例
前端调用 /api/getFileUrl,后端返回: