Minio 小技巧 | 通过编码设置桶策略,实现永久访问和下载
你好,我是博主寧在春
之前其實(shí)也寫過一篇關(guān)于Minio設(shè)置桶策略的文章,但是是為了解決通過永久訪問的問題。那個(gè)時(shí)候是使用Minio的客戶端mc來設(shè)置的,非常的不方便,每次給桶設(shè)置策略時(shí)候,都需要進(jìn)入mc去設(shè)置。有小伙伴就私信問我,有沒有可以在編碼中可以設(shè)置桶策略的。
上篇:Docker 安裝Minio Client,解決如何設(shè)置永久訪問和下載鏈接
上上篇:SpringBoot 集成 Minio,實(shí)現(xiàn)使用自己 的文件服務(wù)器
上上上篇:Docker 安裝 minio
minio版本:8.3.0
一、官網(wǎng)
Minio-github
我先去gitgub上看了一下Minio的API,確實(shí)有個(gè)設(shè)置桶策略的API。
我是看了又看,也沒明白個(gè)啥,真心話。
PolicyType.NONE, PolicyType.READ_ONLY, PolicyType.READ_WRITE, PolicyType.WRITE_ONLY,這個(gè)PolicyType也沒指明,是真的麻煩啊。
去看例子也沒有找到。👨?💻
后來在百度上搜了一下Minio策略,才知道用的是Minio的桶策略是基于訪問策略語言規(guī)范(Access Policy Language specification)的解析和驗(yàn)證存儲桶訪問策略 –Amazon S3。可簡單理解為資源-權(quán)限模型吧。具體沒深入😂。
意思雖然是參數(shù)中的那樣,但是寫起來是一點(diǎn)關(guān)系也沒有😂
二、策略
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è)來解釋哈:
Version:版本的意思,好像是固定的,看了大家都這么寫,沒找到原因
Actions– 對于每個(gè)資源,Amazon S3 支持一組操作。您可以使用操作關(guān)鍵字標(biāo)識將允許(或拒絕)的資源操作。
Principal :被允許訪問語句中的操作和資源的帳戶或用戶。在存儲桶策略中,委托人是作為此權(quán)限接收者的用戶、賬戶、服務(wù)或其他實(shí)體。
Condition– 政策生效的條件。您可以使用 AWS范圍的密鑰和 Amazon S3 特定的密鑰來指定 Amazon S3 訪問策略中的條件。
Resource– 存儲桶、對象、訪問點(diǎn)和作業(yè)是您可以允許或拒絕權(quán)限的 Amazon S3 資源。在策略中,您使用 Amazon 資源名稱 (ARN) 來標(biāo)識資源。
Effect:對于每個(gè)資源,Amazon S3 支持一組操作。您可以使用操作關(guān)鍵字標(biāo)識將允許(或拒絕)的資源操作。
如:該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è)是對那個(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)寫過SpringBoot整合Minio,但桶的策略設(shè)置并非是編碼設(shè)置的。有需求可前往去看。
CSDN:SpringBoot整合Minio 項(xiàng)目中使用自己文件存儲服務(wù)器!!!
掘金:SpringBoot整合Minio 項(xiàng)目中使用自己文件存儲服務(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í)行完后會替換掉原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 存儲桶名稱 */ @SneakyThrows public void setBucketPolicy(String bucketName) {String policy= PolicyJsonUtils.json2String("policyJson.json",bucketName);//用工具類 就是把里面的常量替換出來就可以了,當(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、測試
創(chuàng)建一個(gè)存儲桶。
上傳圖片:
直接點(diǎn)擊這個(gè)鏈接是無法訪問的。會報(bào)這樣的錯(cuò)誤。
設(shè)置策略:
我們再訪問一次之前的鏈接,就已經(jīng)是可以訪問的狀態(tài)了。
三、自言自語
本文就是簡單介紹了,具體使用具體情況具體分析啦。
你好,我是博主寧在春:主頁
希望本篇文章能讓你感到有所收獲!!!
祝 我們:待別日相見時(shí),都已有所成。
總結(jié)
以上是生活随笔為你收集整理的Minio 小技巧 | 通过编码设置桶策略,实现永久访问和下载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你知道从浏览器发送请求给SpringBo
- 下一篇: Dockerfile中的保留字指令讲解