【MinIO实战】MinIO权限策略设置与上传文件时报错Access Denied排查

一、限制用户访问特定桶设置

参考:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值