2025年3月22日 星期六 甲辰(龙)年 月廿一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 服务器 > 万维网络 > 其它源码

Minio 小技巧 | 通过编码设置桶策略,实现永久访问和下载

时间:06-14来源:作者:点击数:42

minio版本:8.3.0

一、官网

Minio-github

我先去gitgub上看了一下Minio的API,确实有个设置桶策略的API。

image-20210920115930681

我是看了又看,也没明白个啥,真心话。

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"
  • ]
  • }
  • ]
  • }

一个个来解释哈:

  1. Version:版本的意思,好像是固定的,看了大家都这么写,没找到原因
  2. Actions– 对于每个资源,Amazon S3 支持一组操作。您可以使用操作关键字标识将允许(或拒绝)的资源操作。
  3. Principal:被允许访问语句中的操作和资源的帐户或用户。在存储桶策略中,委托人是作为此权限接收者的用户、账户、服务或其他实体。
  4. Condition– 政策生效的条件。您可以使用AWS范围的密钥和Amazon S3特定的密钥来指定Amazon S3访问策略中的条件。
  5. Resource– 存储桶、对象、访问点和作业是您可以允许或拒绝权限的 Amazon S3 资源。在策略中,您使用 Amazon 资源名称 (ARN) 来标识资源。
  6. 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,但桶的策略设置并非是编码设置的。有需求可前往去看。

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、测试

创建一个存储桶。

image-20210920130056376

上传图片:

image-20210920130148201

直接点击这个链接是无法访问的。会报这样的错误。

image-20210920130229288

设置策略:

image-20210920130307797

我们再访问一次之前的链接,就已经是可以访问的状态了。

image-20210920130345476
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门