日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/19 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Minio 小技巧 | 通过编码设置桶策略,实现永久访问和下载 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

你好,我是博主寧在春

之前其實(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:ListMultipartUploadParts

    2.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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。