Minio作为轻量级对象存储服务,常被用于私有云或本地存储场景,在实际使用中通常需要为不同用户分配不同的存储桶访问权限,比如限制某个用户只能读取指定存储桶的文件,或者只能上传特定前缀的对象。AWS SDK for Java 2.x遵循S3兼容协议,能够直接对接Minio服务,通过其提供的策略管理接口可以便捷地完成用户访问策略的配置工作。

环境准备
引入依赖
首先需要在Java项目的构建文件中引入AWS SDK for Java 2.x的S3相关依赖,这里以Maven项目为例,在pom.xml中添加如下依赖:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.20.0</version>
</dependency>
初始化Minio客户端
Minio服务兼容S3的访问协议,因此可以使用S3Client来对接Minio,初始化时需要指定Minio服务的访问地址、认证信息,同时关闭路径样式访问的强制校验,适配Minio的默认配置:
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.S3Configuration;
import java.net.URI;
public class MinioClientUtil {
public static S3Client getMinioClient() {
// Minio服务的访问地址,替换为实际的Minio地址
String minioEndpoint = "http://127.0.0.1:9000";
// Minio的访问密钥
String accessKey = "minioadmin";
// Minio的私有密钥
String secretKey = "minioadmin";
AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey);
S3Configuration s3Config = S3Configuration.builder()
// 关闭路径样式访问强制校验,适配Minio默认配置
.pathStyleAccessEnabled(true)
.build();
return S3Client.builder()
.endpointOverride(URI.create(minioEndpoint))
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.region(Region.US_EAST_1)
.serviceConfiguration(s3Config)
.build();
}
}
构建存储桶访问策略
Minio的存储桶访问策略遵循AWS S3的策略语法,是一个JSON格式的配置内容,我们可以根据需要定义用户的操作权限和资源范围。以下是一个限制用户只能读取指定存储桶test-bucket下所有对象的策略示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::test-bucket",
"arn:aws:s3:::test-bucket/*"
]
}
]
}
上述策略中,Effect设置为Allow表示允许操作,Action定义了允许的操作类型,Resource指定了策略生效的资源范围,这里分别对应存储桶本身和存储桶下的所有对象。
配置用户访问策略
通过S3Client的putBucketPolicy接口可以将构建好的策略应用到指定的存储桶上,完整实现代码如下:
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutBucketPolicyRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;
import java.nio.charset.StandardCharsets;
public class MinioPolicyConfig {
public static void main(String[] args) {
S3Client s3Client = MinioClientUtil.getMinioClient();
// 目标存储桶名称
String bucketName = "test-bucket";
// 之前构建的策略JSON字符串
String policyJson = "{n" +
" "Version": "2012-10-17",n" +
" "Statement": [n" +
" {n" +
" "Effect": "Allow",n" +
" "Action": [n" +
" "s3:GetObject",n" +
" "s3:ListBucket"n" +
" ],n" +
" "Resource": [n" +
" "arn:aws:s3:::" + bucketName + "",n" +
" "arn:aws:s3:::" + bucketName + "/*"n" +
" ]n" +
" }n" +
" ]n" +
"}";
try {
PutBucketPolicyRequest policyRequest = PutBucketPolicyRequest.builder()
.bucket(bucketName)
.policy(policyJson)
.build();
s3Client.putBucketPolicy(policyRequest);
System.out.println("存储桶" + bucketName + "的用户访问策略配置成功");
} catch (S3Exception e) {
System.err.println("策略配置失败,错误码:" + e.statusCode() + ",错误信息:" + e.getMessage());
} finally {
s3Client.close();
}
}
}
策略验证与问题排查
配置完成后可以通过以下方式验证策略是否生效:
- 使用配置对应的用户凭证访问存储桶,尝试执行策略允许的操作,确认可以正常执行
- 尝试执行策略未允许的操作,比如删除对象,确认操作被拒绝
- 如果出现权限校验失败的问题,可以检查策略中的资源ARN是否正确,Minio的ARN格式和AWS S3一致,存储桶的ARN为arn:aws:s3:::存储桶名称
- 确认Minio服务是否开启了策略校验功能,部分旧版本Minio可能需要手动开启相关配置
常见策略场景示例
除了只读策略,还可以根据需求配置其他类型的策略,比如允许上传的策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::test-bucket",
"arn:aws:s3:::test-bucket/*"
]
}
]
}
如果需要限制用户只能访问存储桶下特定前缀的对象,可以修改Resource字段为arn:aws:s3:::test-bucket/prefix/*,其中prefix替换为实际的前缀名称。
AWS_SDK_for_Java_2.xMinio存储桶访问策略用户权限配置修改时间:2026-07-08 23:24:38