【MinIO实战】MinIO权限策略设置与上传文件时报错Access Denied排查
文章目录
- 一、限制用户访问特定桶设置
- 二、使用 Java MinIO SDK 实现文件上传时报错
- 三、核心问题出在哪
- 四、解决方案:加上 `s3:GetBucketLocation`
- 五、总结:隐藏但必不可少的权限
一、限制用户访问特定桶设置
参考:
https://www.cnblogs.com/echohye/p/18533117
二、使用 Java MinIO SDK 实现文件上传时报错
我们用如下代码,通过 MinioClient
上传本地 .jar
文件到 target-bucket
:
MinioClient minioClient = MinioClient.builder().endpoint("http://localhost:9000").credentials("dljt3", "123321").build();File file = new File("/path/to/MinioUploader.jar");
try (FileInputStream fis = new FileInputStream(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