你好,我是博主
宁在春
之前其实也写过一篇关于
Minio
设置桶策略的文章,但是是为了解决通过永久访问的问题。那个时候是使用Minio的客户端mc
来设置的,非常的不方便,每次给桶设置策略时候,都需要进入mc
去设置。有小伙伴就私信问我,有没有可以在编码中可以设置桶策略的。
上篇:Docker 安装Minio Client,解决如何设置永久访问和下载链接
上上篇:SpringBoot 集成 Minio,实现使用自己 的文件服务器
上上上篇:Docker 安装 minio
minio
版本:8.3.0
一、官网
我先去gitgub
上看了一下Minio的API,确实有个设置桶策略的API。
我是看了又看,也没明白个啥,真心话。
PolicyType.NONE, PolicyType.READ_ONLY, PolicyType.READ_WRITE, PolicyType.WRITE_ONLY
,这个PolicyType
也没指明,是真的麻烦啊。
去看例子也没有找到。👨💻
后来在百度上搜了一下Minio策略,才知道用的是Minio的桶策略是基于访问策略语言规范(Access Policy Language specification)的解析和验证存储桶访问策略 –Amazon S3。可简单理解为资源-权限模型吧。具体没深入😂。
意思虽然是参数中的那样,但是写起来是一点关系也没有😂
二、策略
2.1、介绍
我们先看个Amazon S3官方例子:
{
"Version": "2012-10-17",
"Id": "ExamplePolicy01",
"Statement": [
{
"Sid": "ExampleStatement01",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/Dave"
},
"Action": [
"s3:GetObject",
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::awsexamplebucket1/*",
"arn:aws:s3:::awsexamplebucket1"
]
}
]
}
一个个来解释哈:
-
Version:版本的意思,好像是固定的,看了大家都这么写,没找到原因
-
Actions– 对于每个资源,Amazon S3 支持一组操作。您可以使用操作关键字标识将允许(或拒绝)的资源操作。
-
Principal :被允许访问语句中的操作和资源的帐户或用户。在存储桶策略中,委托人是作为此权限接收者的用户、账户、服务或其他实体。
-
Condition– 政策生效的条件。您可以使用
AWS
范围的密钥和Amazon S3
特定的密钥来指定Amazon S3
访问策略中的条件。 -
Resource– 存储桶、对象、访问点和作业是您可以允许或拒绝权限的 Amazon S3 资源。在策略中,您使用 Amazon 资源名称 (ARN) 来标识资源。
-
Effect:对于每个资源,Amazon S3 支持一组操作。您可以使用操作关键字标识将允许(或拒绝)的资源操作。
如:该
s3:ListBucket
权限允许用户使用 Amazon S3 GET Bucket (List Objects)操作。
Actions支持一下操作:
s3:GetObject
s3:ListBucket
s3:PutObject
s3:GetBucketLocation
s3:DeleteObject
s3:AbortMultipartUpload
s3:ListBucketMultipartUploads
s3:ListMultipartUploadParts
2.2、实现
我写的这个是对那个桶内的资源实现可读可写。
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"AWS":["*"]
},
"Action":[
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource":[
"arn:aws:s3:::MybuckerName"
]
},
{
"Effect":"Allow",
"Principal":{
"AWS":["*"]
},
"Action":[
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:ListMultipartUploadParts",
"s3:PutObject"
],
"Resource":[
"arn:aws:s3::: MybuckerName/*"
]
}
]
}
2.3、集成SpringBoot,编码设置桶策略
之前已经写过SpringBoot整合Minio,但桶的策略设置并非是编码设置的。有需求可前往去看。
CSDN:SpringBoot整合Minio 项目中使用自己文件存储服务器!!!
掘金:SpringBoot整合Minio 项目中使用自己文件存储服务器!!!
2.3.1、添加一个policyJson.json文件
我们总不能每次还去代码里修改吧
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"AWS":["*"]
},
"Action":[
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource":[
"arn:aws:s3:::MybuckerName"
]
},
{
"Effect":"Allow",
"Principal":{
"AWS":["*"]
},
"Action":[
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:ListMultipartUploadParts",
"s3:PutObject"
],
"Resource":[
"arn:aws:s3::: MybuckerName/*"
]
}
]
}
2.3.2、写一个工具类
/**
* @Author: crush
* @Date: 2021-09-19 15:34
* version 1.0
*/
public class PolicyJsonUtils {
/**
* json转String
* @param path 文件路径
* @param bucketName 这里是传入的桶名称,执行完后会替换掉原json文件中的MybuckerName
* @return
* @throws IOException
*/
public static String json2String(String path, String bucketName) throws IOException {
StringBuilder result = new StringBuilder();
ClassPathResource resource = new ClassPathResource(path);
InputStream in = resource.getInputStream();
// 读取文件上的数据。
// 将字节流向字符流的转换。
// 读取
InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8);
// 创建字符流缓冲区
// 缓冲
BufferedReader bufr = new BufferedReader(isr);
String line = null;
while ((line = bufr.readLine()) != null) {
result.append(System.lineSeparator()+line);
}
isr.close();
JSONObject parse = (JSONObject) JSONObject.parse(result.toString());
JSONArray statement = (JSONArray) parse.get("Statement");
JSONObject o = (JSONObject) statement.get(0);
o.remove("Resource");
o.fluentPut("Resource", "arn:aws:s3:::" + bucketName);
JSONObject o1 = (JSONObject) statement.get(1);
o1.remove("Resource");
o1.fluentPut("Resource", "arn:aws:s3:::" + bucketName + "/*");
return parse.toString();
}
}
设置桶策略
/**
* 占位符
*/
private static final String BUCKET_PARAM = "${bucket}";
/**
* bucket权限-读写
*/
private static final String READ_WRITE = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\",\"s3:AbortMultipartUpload\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "/*\"]}]}";
/**
* bucket权限-只读
*/
private static final String WRITE_ONLY = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "/*\"]}]}";
/**
* 给桶设置策略 ,可读可写等等
*
* @param bucketName 存储桶名称
*/
@SneakyThrows
public void setBucketPolicy(String bucketName) {
String policy= PolicyJsonUtils.json2String("policyJson.json",bucketName);
//用工具类 就是把里面的常量替换出来就可以了,当时写了两种方式(喜欢那种就用那种吧)
minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).
config(READ_WRITE.replace(BUCKET_PARAM, bucketName)).build());
}
/**
* 设置桶策略
* @param bucketName
* @return
*/
void setPolicy(String bucketName);
@Override
public void setPolicy(String bucketName) {
minioUtil.setBucketPolicy(bucketName);
}
@GetMapping("/setPolicy/{bucketName}")
public String setPolicy(@PathVariable String bucketName){
minioService.setPolicy(bucketName);
return "设置成功";
}
2.4、测试
创建一个存储桶。
上传图片:
直接点击这个链接是无法访问的。会报这样的错误。
设置策略:
我们再访问一次之前的链接,就已经是可以访问的状态了。
三、自言自语
本文就是简单介绍了,具体使用具体情况具体分析啦。
你好,我是博主
宁在春
:主页希望本篇文章能让你感到有所收获!!!
祝
我们:待别日相见时,都已有所成
。