基于S3协议对外分享文件权限管理方案

本篇文章以MinIO作为文件服务端,其他基于S3协议的文件服务也一样。 通过接口返回文件地址给前端时,可以结合 S3 的预签名 URL 或 STS(临时凭证) 来实现安全访问。 核心思路 接口返回的文件地址不直接暴露 MinIO 存储路径。 在返回文件地址前,通过后端生成 预签名 URL 或 动态临时凭证。 前端使用该地址访问文件,确保文件访问受到权限和时间限制。 实现方法 1:基于预签名 URL 1.1 后端生成预签名 URL 使用 MinIO 提供的 SDK,在接口中动态生成带有时间限制的预签名 URL,并返回给前端。 Java 示例代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 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,后端返回: ...

2025年10月9日 · 2 分钟 · 浅忆

生产环境对于文件服务注意事项

生产环境对于文件服务,尤其是对外提供访问的场景,需要注意以下几点,以防止伪装文件被解析执行等安全风险,从而被黑产利用上传恶意文件,如上传 html 作为钓鱼、菠菜、跳转 进行传播,利用你的域名当作跳板,导致域名封、通报、用户上当受骗等问题。 ...

2025年2月7日 · 2 分钟 · 浅忆