Minio 小技巧 | 通过编码设置桶策略,实现分享永久可下载

简介: Minio 小技巧 | 通过编码设置桶策略,实现分享永久可下载

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

你好,我是博主宁在春

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

上篇:Docker 安装Minio Client,解决如何设置永久访问和下载链接👨‍💻

minio版本:8.3.0

一、官网

Minio-github

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

1704461288417.jpg

我是看了又看,也没明白个啥,真心话。

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"
            ]
        }
    ]
}

一个个来解释哈:

  1. Version:版本的意思,好像是固定的,看了大家都这么写,没找到原因
  2. Actions– 对于每个资源,Amazon S3 支持一组操作。您可以使用操作关键字标识将允许(或拒绝)的资源操作。
  3. Principal :被允许访问语句中的操作和资源的帐户或用户。在存储桶策略中,委托人是作为此权限接收者的用户、账户、服务或其他实体。
  4. Condition– 政策生效的条件。您可以使用 AWS 范围的密钥和 Amazon S3 特定的密钥来指定 Amazon S3 访问策略中的条件。
  5. Resource– 存储桶、对象、访问点和作业是您可以允许或拒绝权限的 Amazon S3 资源。在策略中,您使用 Amazon 资源名称 (ARN) 来标识资源。
  6. 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:ListMultipartUploadParts

2.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、测试

创建一个存储桶。

1704461303396.jpg

上传图片:

1704461305592.jpg

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

1704461308321.jpg

设置策略:

1704461311511.jpg

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

1704461314317.jpg

三、自言自语

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

希望本篇文章能让你感到有所收获!!!

我们:待别日相见时,都已有所成

目录
相关文章
|
存储 Java 文件存储
|
2月前
|
机器学习/深度学习 数据可视化 算法
基于大数据的信贷风险评估的数据可视化分析与预测系统
本系统基于Java、Vue和Spring Boot技术,构建信贷风险评估的可视化分析与预测平台。融合机器学习模型与数据可视化,实现信贷数据的高效处理、风险精准预测与直观展示,提升金融机构风控能力与决策效率。
|
Java 应用服务中间件 nginx
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
3922 0
|
Linux
修复io.minio.errors.ErrorResponseException: Access denied错误
修复io.minio.errors.ErrorResponseException: Access denied错误
1855 0
|
JavaScript 前端开发
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
3768 0
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
|
5月前
|
数据采集 人工智能 搜索推荐
完蛋啦,爆火Github项目,用微信聊天记录打造专属AI数字分身,我都不敢相信!!
WeClone 是一个基于微信或 Telegram 聊天记录微调大语言模型的开源项目,可打造专属 AI 数字分身。支持文本、图片等多模态数据,具备语言风格迁移和语音克隆功能,实现“说话像你”的AI角色。项目提供完整训练流程,支持本地部署,保护隐私,适用于个人数字分身、纪念机器人、客服助手等场景。
768 0
|
6月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
1240 1
|
6月前
|
SQL 人工智能 数据挖掘
Apache Doris + MCP:Agent 时代的实时数据分析底座
数据不再是静态的存储对象,而是流动的智能资源;数据库不再是单纯的存储系统,而是智能化的服务平台。Apache Doris 以其在 AI 方向的深度布局和技术创新,正在成为连接数据与智能的重要桥梁。
1376 0
Apache Doris + MCP:Agent 时代的实时数据分析底座
|
12月前
|
存储 Cloud Native Java
Windows下Minio的安装以及基本使用
MinIO 是一个开源的云原生分布式对象存储系统,兼容亚马逊S3接口,适合存储大容量非结构化数据。本文介绍Windows下MinIO的安装与基本使用:通过以上步骤,您可以在Windows环境中成功安装并使用MinIO。
7937 18
|
存储 监控 数据可视化
常见的分布式定时任务调度框架
分布式定时任务调度框架用于在分布式系统中管理和调度定时任务,确保任务按预定时间和频率执行。其核心概念包括Job(任务)、Trigger(触发器)、Executor(执行器)和Scheduler(调度器)。这类框架应具备任务管理、任务监控、良好的可扩展性和高可用性等功能。常用的Java生态中的分布式任务调度框架有Quartz Scheduler、ElasticJob和XXL-JOB。
4580 66