Minio 小技巧

您所在的位置:网站首页 永久访问本站导航怎么设置的 Minio 小技巧

Minio 小技巧

2024-07-17 17:11| 来源: 网络整理| 查看: 265

你好,我是博主宁在春 之前其实也写过一篇关于Minio设置桶策略的文章,但是是为了解决通过永久访问的问题。那个时候是使用Minio的客户端mc来设置的,非常的不方便,每次给桶设置策略时候,都需要进入mc去设置。有小伙伴就私信问我,有没有可以在编码中可以设置桶策略的。

上篇:Docker 安装Minio Client,解决如何设置永久访问和下载链接 上上篇:SpringBoot 集成 Minio,实现使用自己 的文件服务器 上上上篇:Docker 安装 minio

minio版本:8.3.0

一、官网

Minio-github

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

image-20210920115930681image-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官方例子:

代码语言:javascript复制{ "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支持一下操作:

代码语言:javascript复制s3:GetObject s3:ListBucket s3:PutObject s3:GetBucketLocation s3:DeleteObject s3:AbortMultipartUpload s3:ListBucketMultipartUploads s3:ListMultipartUploadParts2.2、实现

我写的这个是对那个桶内的资源实现可读可写。

代码语言:javascript复制{ "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文件

我们总不能每次还去代码里修改吧

代码语言:javascript复制{ "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、写一个工具类代码语言:javascript复制/** * @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(); } }

设置桶策略

代码语言:javascript复制 /** * 占位符 */ 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()); }代码语言:javascript复制/** * 设置桶策略 * @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-20210920130056376image-20210920130056376

上传图片:

image-20210920130148201image-20210920130148201

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

image-20210920130229288image-20210920130229288

设置策略:

image-20210920130307797image-20210920130307797

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

image-20210920130345476image-20210920130345476三、自言自语

本文就是简单介绍了,具体使用具体情况具体分析啦。

你好,我是博主宁在春:主页 希望本篇文章能让你感到有所收获!!! 祝 我们:待别日相见时,都已有所成。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3