Minio 小技巧 | 通过编码设置桶策略,实现永久访问和下载
你好,我是博主寧在春
之前其實(shí)也寫過(guò)一篇關(guān)于Minio設(shè)置桶策略的文章,但是是為了解決通過(guò)永久訪問(wèn)的問(wèn)題。那個(gè)時(shí)候是使用Minio的客戶端mc來(lái)設(shè)置的,非常的不方便,每次給桶設(shè)置策略時(shí)候,都需要進(jìn)入mc去設(shè)置。有小伙伴就私信問(wèn)我,有沒(méi)有可以在編碼中可以設(shè)置桶策略的。
上篇:Docker 安裝Minio Client,解決如何設(shè)置永久訪問(wèn)和下載鏈接
上上篇:SpringBoot 集成 Minio,實(shí)現(xiàn)使用自己 的文件服務(wù)器
上上上篇:Docker 安裝 minio
minio版本:8.3.0
一、官網(wǎng)
Minio-github
我先去gitgub上看了一下Minio的API,確實(shí)有個(gè)設(shè)置桶策略的API。
我是看了又看,也沒(méi)明白個(gè)啥,真心話。
PolicyType.NONE, PolicyType.READ_ONLY, PolicyType.READ_WRITE, PolicyType.WRITE_ONLY,這個(gè)PolicyType也沒(méi)指明,是真的麻煩啊。
去看例子也沒(méi)有找到。👨?💻
后來(lái)在百度上搜了一下Minio策略,才知道用的是Minio的桶策略是基于訪問(wèn)策略語(yǔ)言規(guī)范(Access Policy Language specification)的解析和驗(yàn)證存儲(chǔ)桶訪問(wèn)策略 –Amazon S3。可簡(jiǎn)單理解為資源-權(quán)限模型吧。具體沒(méi)深入😂。
意思雖然是參數(shù)中的那樣,但是寫起來(lái)是一點(diǎn)關(guān)系也沒(méi)有😂
二、策略
2.1、介紹
我們先看個(gè)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"]}] }一個(gè)個(gè)來(lái)解釋哈:
Version:版本的意思,好像是固定的,看了大家都這么寫,沒(méi)找到原因
Actions– 對(duì)于每個(gè)資源,Amazon S3 支持一組操作。您可以使用操作關(guān)鍵字標(biāo)識(shí)將允許(或拒絕)的資源操作。
Principal :被允許訪問(wèn)語(yǔ)句中的操作和資源的帳戶或用戶。在存儲(chǔ)桶策略中,委托人是作為此權(quán)限接收者的用戶、賬戶、服務(wù)或其他實(shí)體。
Condition– 政策生效的條件。您可以使用 AWS范圍的密鑰和 Amazon S3 特定的密鑰來(lái)指定 Amazon S3 訪問(wèn)策略中的條件。
Resource– 存儲(chǔ)桶、對(duì)象、訪問(wèn)點(diǎn)和作業(yè)是您可以允許或拒絕權(quán)限的 Amazon S3 資源。在策略中,您使用 Amazon 資源名稱 (ARN) 來(lái)標(biāo)識(shí)資源。
Effect:對(duì)于每個(gè)資源,Amazon S3 支持一組操作。您可以使用操作關(guān)鍵字標(biāo)識(shí)將允許(或拒絕)的資源操作。
如:該s3:ListBucket權(quán)限允許用戶使用 Amazon S3 GET Bucket (List Objects)操作。
Actions支持一下操作:
s3:GetObject s3:ListBucket s3:PutObject s3:GetBucketLocation s3:DeleteObject s3:AbortMultipartUpload s3:ListBucketMultipartUploads s3:ListMultipartUploadParts2.2、實(shí)現(xiàn)
我寫的這個(gè)是對(duì)那個(gè)桶內(nèi)的資源實(shí)現(xiàn)可讀可寫。
{"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,編碼設(shè)置桶策略
之前已經(jīng)寫過(guò)SpringBoot整合Minio,但桶的策略設(shè)置并非是編碼設(shè)置的。有需求可前往去看。
CSDN:SpringBoot整合Minio 項(xiàng)目中使用自己文件存儲(chǔ)服務(wù)器!!!
掘金:SpringBoot整合Minio 項(xiàng)目中使用自己文件存儲(chǔ)服務(wù)器!!!
2.3.1、添加一個(gè)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、寫一個(gè)工具類
/*** @Author: crush* @Date: 2021-09-19 15:34* version 1.0*/ public class PolicyJsonUtils {/*** json轉(zhuǎn)String * @param path 文件路徑* @param bucketName 這里是傳入的桶名稱,執(zhí)行完后會(huì)替換掉原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();// 讀取文件上的數(shù)據(jù)。// 將字節(jié)流向字符流的轉(zhuǎn)換。// 讀取InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8);// 創(chuàng)建字符流緩沖區(qū)// 緩沖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();} }設(shè)置桶策略
/*** 占位符*/private static final String BUCKET_PARAM = "${bucket}";/*** bucket權(quán)限-讀寫*/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權(quán)限-只讀*/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 + "/*\"]}]}";/** * 給桶設(shè)置策略 ,可讀可寫等等 * * @param bucketName 存儲(chǔ)桶名稱 */ @SneakyThrows public void setBucketPolicy(String bucketName) {String policy= PolicyJsonUtils.json2String("policyJson.json",bucketName);//用工具類 就是把里面的常量替換出來(lái)就可以了,當(dāng)時(shí)寫了兩種方式(喜歡那種就用那種吧)minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).config(READ_WRITE.replace(BUCKET_PARAM, bucketName)).build()); } /** * 設(shè)置桶策略 * @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 "設(shè)置成功"; }2.4、測(cè)試
創(chuàng)建一個(gè)存儲(chǔ)桶。
上傳圖片:
直接點(diǎn)擊這個(gè)鏈接是無(wú)法訪問(wèn)的。會(huì)報(bào)這樣的錯(cuò)誤。
設(shè)置策略:
我們?cè)僭L問(wèn)一次之前的鏈接,就已經(jīng)是可以訪問(wèn)的狀態(tài)了。
三、自言自語(yǔ)
本文就是簡(jiǎn)單介紹了,具體使用具體情況具體分析啦。
你好,我是博主寧在春:主頁(yè)
希望本篇文章能讓你感到有所收獲!!!
祝 我們:待別日相見(jiàn)時(shí),都已有所成。
總結(jié)
以上是生活随笔為你收集整理的Minio 小技巧 | 通过编码设置桶策略,实现永久访问和下载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 你知道从浏览器发送请求给SpringBo
- 下一篇: JUC系列(十一) | Java 8 C