当前位置: 首页 > news >正文

【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
http://www.xdnf.cn/news/161929.html

相关文章:

  • 03.01、三合一
  • CentOS7 部署 Ollama 全栈指南:构建安全远程大模型服务
  • 【Python】Python中的浅拷贝和深拷贝
  • Halcon算子应用和技巧13
  • Spring AI Alibaba - Milvus 初体验,实现知识库效果
  • SDC命令详解:使用reset_design命令重置设计
  • 力扣热题100题解(c++)—链表
  • Python项目实践:控制台银行系统与词频统计工具开发指南
  • c#简易超市充值卡程序充值消费查余额
  • 升级 Spring Boot CLI
  • 信用中国【国密SM2、SM4加解密】逆向算法分析
  • 【学习笔记】Stata
  • CD32.【C++ Dev】类和对象(22) 内存管理(下)
  • 在线录屏工具(压箱底)-免费高清
  • 基于QT的仿QQ音乐播放器
  • Pygame精灵进阶:动画序列与角色控制
  • 信息论核心概念详解
  • 利用【指针引用】对【非空单循环链表】进行删除操作
  • 服务器虚拟化:技术解析与实践指南
  • 协程(微线程)
  • Kdenlive 中的变形、畸变、透视相关功能
  • Python函数基础:简介,函数的定义,函数的调用和传入参数,函数的返回值
  • 架构整洁之道 心得
  • 【线段树】P11414 [EPXLQ2024 fall round] 神奇磁铁|普及+
  • 如何在 PowerShell 脚本中调用外部 Windows 命令
  • 精益数据分析(29/126):深入剖析电子商务商业模式
  • 021-C语言文件操作
  • Linux系统性能调优技巧分享
  • 如何创建一个C#项目(基于VS2022版)
  • 本地电脑安装DeepSeek