文章目录
- 一、限制用户访问特定桶设置
- 二、使用 Java MinIO SDK 实现文件上传时报错
- 三、核心问题出在哪
- 四、解决方案:加上 `s3:GetBucketLocation`
- 五、总结:隐藏但必不可少的权限
一、限制用户访问特定桶设置
参考:
https://www.cnblogs.com/echohye/p/18533117
二、使用 Java MinIO SDK 实现文件上传时报错
我们用如下代码,通过MinioClient上传本地.jar文件到target-bucket:
MinioClientminioClient=MinioClient.builder().endpoint("http://localhost:9000").credentials("dljt3","123321").build();Filefile=newFile("/path/to/MinioUploader.jar");try(FileInputStreamfis=newFileInputStream(file)){minioClient.putObject(PutObjectArgs.builder().bucket("target-bucket").object("test-MinioUploader.jar").stream(fis,file.length(),-1).contentType("application/octet-stream").build());System.out.println("✅ File uploaded successfully");}但是运行时,却直接报错 ❌:
❌ Upload failed: Access Denied. ErrorResponse(code=AccessDenied, message=Access Denied., bucketName=target-bucket,...)三、核心问题出在哪
我们查看 MinIO 后台日志和 Java 报错栈发现了这个请求:
GET /target-bucket?location原来,MinIO Java SDK 在上传文件前,会尝试获取 bucket 的 region,即调用s3:GetBucketLocation权限。
而我们一开始设置的策略是这样的:
{"Effect":"Allow","Action":["s3:DeleteObject","s3:GetObject","s3:ListBucket","s3:PutObject"],"Resource":["arn:aws:s3:::target-bucket","arn:aws:s3:::target-bucket/*"]}虽然PutObject权限是有的,但缺了GetBucketLocation,导致 SDK 请求 bucket region 时 403 被拒。
四、解决方案:加上s3:GetBucketLocation
最终,把权限策略改为:
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:DeleteObject","s3:GetObject","s3:ListBucket","s3:PutObject","s3:GetBucketLocation"],"Resource":["arn:aws:s3:::target-bucket","arn:aws:s3:::target-bucket/*"]}]}重新绑定策略,再次运行程序,文件上传成功 ✅
五、总结:隐藏但必不可少的权限
MinIO 遵循 AWS S3 的 API 语义,很多 SDK 在上传前会隐式调用GetBucketLocation,所以上传类权限并不止PutObject一个。
如果你在明明“该有的权限都有”的情况下仍然报
AccessDenied,优先检查:
- 是否缺了
s3:GetBucketLocation- 是否资源路径写成了
bucket/*却忘了加上根路径bucket