Minio 小技巧 | 通过编码设置桶策略,实现永久访问和下载
你好,我是博主寧在春
之前其實也寫過一篇關于Minio設置桶策略的文章,但是是為了解決通過永久訪問的問題。那個時候是使用Minio的客戶端mc來設置的,非常的不方便,每次給桶設置策略時候,都需要進入mc去設置。有小伙伴就私信問我,有沒有可以在編碼中可以設置桶策略的。
上篇:Docker 安裝Minio Client,解決如何設置永久訪問和下載鏈接
上上篇:SpringBoot 集成 Minio,實現使用自己 的文件服務器
上上上篇:Docker 安裝 minio
minio版本:8.3.0
一、官網
Minio-github
我先去gitgub上看了一下Minio的API,確實有個設置桶策略的API。
我是看了又看,也沒明白個啥,真心話。
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"]}] }一個個來解釋哈:
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支持一下操作:
s3:GetObject s3:ListBucket s3:PutObject s3:GetBucketLocation s3:DeleteObject s3:AbortMultipartUpload s3:ListBucketMultipartUploads s3:ListMultipartUploadParts2.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,但桶的策略設置并非是編碼設置的。有需求可前往去看。
CSDN: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、測試
創建一個存儲桶。
上傳圖片:
直接點擊這個鏈接是無法訪問的。會報這樣的錯誤。
設置策略:
我們再訪問一次之前的鏈接,就已經是可以訪問的狀態了。
三、自言自語
本文就是簡單介紹了,具體使用具體情況具體分析啦。
你好,我是博主寧在春:主頁
希望本篇文章能讓你感到有所收獲!!!
祝 我們:待別日相見時,都已有所成。
總結
以上是生活随笔為你收集整理的Minio 小技巧 | 通过编码设置桶策略,实现永久访问和下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你知道从浏览器发送请求给SpringBo
- 下一篇: Dockerfile中的保留字指令讲解