首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在Minio以STS方式获得临时凭据上传文件

在Minio以STS方式获得临时凭据上传文件

作者头像
张云飞Vir
发布于 2023-04-19 11:18:11
发布于 2023-04-19 11:18:11
7.8K00
代码可运行
举报
文章被收录于专栏:写代码和思考写代码和思考
运行总次数:0
代码可运行

一、写在前面

一个常见的场景是:需要让客户端来上传图片,面临的安全性问题。给与客户端永久凭据无疑是很大风险的,我们还可以选择“给予一个临时凭据,这个凭据关联到一个 授权的用户,我们可以随时停用和修改这个用户具有的权限”

Minio提供了STS 的方式来实现这个方法。

MinIO安全令牌服务(STS)API允许应用程序生成用于访问MinIO部署的临时凭据。参考https://min.io/docs/minio/linux/developers/security-token-service.html

整体方案是:

  1. Minio服务器的web页面创建一个 用户和策略
  2. Java应用服务通过 使用上面的用户信息 使用 API 可取得临时的 凭据 token
  3. 将 临时凭据 给到前端 Web,或者App
  4. 前端使用 临时凭据 和 js API 等,进行对象的上传,获得等。

二、部署和启动 Minio

2.1、安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://dl.min.io/server/minio/release/linux-amd64//minio
chmod +x minio

这时可使用 ./minio 了

2.2 启动

./minio server /mnt/data

注意:/mnt/data 是图片存放位置

为了使用方便,自己写个启动脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=password
export MINIO_REGION=cn-beijing-2
nohup ./minio server /mnt/data &

*注意:

  • MINIO_ROOT_USER 你的管理员账号
  • MINIO_ROOT_PASSWORD 你的管理员密码
  • MINIO_REGION 是你指定的区域名

2.3 访问控制台

打开网页: http://你的机器:9000

三、配置临时凭据相关的设置项

我采用 web控制台页面来设置,比较方便。 打开 http://你的机器:9000 , 登录进去

3.1、登录控制面板,创建策略

image.png

image.png

图片中编号3: 填写个策略名 图片中编号4: 填写 json 格式描述的具体策略

可以按我的填,下面的json描述了一个可读,写,删,获得桶位置的策略。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        }
    ]
}

3.2、创建用户,绑定策略

image.png

image.png

图片中编号4:填写一个 用户名(随便填,记下来要用) 图片中编号5:填写一个 密码(随便填,记下来要用) 图片中编号6:打钩选一个策略,就是我们上面 创建的策略 勾选上。

四、通过Java 获得凭据并上传和获得上传后的URL

1、创一个Maven项目 2、 加入依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.3.3</version>
 </dependency>

3、取得临时凭据 一些静态变量定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //服务所在ip地址和端口
    public static final String ENDPOINT = "http://10.0.0.102:9000/";

    //mc的用户名
    public static final String ACCESS_KEY_COMPANY = "sts-user";
    //mc的密码
    public static final String SECRET_KEY_COMPANY = "sts-password";
    //aws服务端点
    public static final String REGION = "cn-beijing-2";
    //上传的bucket名
    public static final String BUCKET = "test";
    //授权策略,允许访问名为bucket的桶的目录
    public static final String ROLE_ARN = "arn:aws:s3:::test/*";
    public static final String ROLE_SESSION_NAME = "anysession";
    //定义策略,可进行二次限定
    public static final String POLICY_GET_AND_PUT = "{\n" +
            " \"Version\": \"2012-10-17\",\n" +
            " \"Statement\": [\n" +
            "  {\n" +
            "   \"Effect\": \"Allow\",\n" +
            "   \"Action\": [\n" +
            "    \"s3:GetObject\",\n" +
            "    \"s3:GetBucketLocation\",\n" +
            "    \"s3:PutObject\"\n" +
            "   ],\n" +
            "   \"Resource\": [\n" +
            "    \"arn:aws:s3:::test/*\"\n" +
            "   ]\n" +
            "  }\n" +
            " ]\n" +
            "}";

得到 临时凭据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /**
     * 得到 临时凭据
     */
    private static Credentials getCredentials() throws NoSuchAlgorithmException {
        int durationSeconds = 360000;//秒
        //创建签名对象
        AssumeRoleProvider provider = new AssumeRoleProvider(
                ENDPOINT,
                ACCESS_KEY_COMPANY,
                SECRET_KEY_COMPANY,
                durationSeconds,//默认3600秒失效,设置小于这个就是3600,大于3600就实际值
                POLICY_GET_AND_PUT,
                REGION,
                ROLE_ARN,
                ROLE_SESSION_NAME,
                null,
                null);
        Date expirationDate = DateUtil.getDateByAddMinute(new Date(), durationSeconds / 60);
        /**
         * 打印provider签名属性
         */
        System.out.println("sessionToken=" + provider.fetch().sessionToken());
        System.out.println("accessKey=" + provider.fetch().accessKey());
        System.out.println("secretKey=" + provider.fetch().secretKey());
        System.out.println("isExpired=" + provider.fetch().isExpired());
        System.out.println("expirationDate=" + DateUtil.getDateTimeFormat(expirationDate));

        Credentials credentials = provider.fetch();
        String sessionToken = provider.fetch().sessionToken();
        String accessKey = provider.fetch().accessKey();
        String secretKey = provider.fetch().secretKey();
        return credentials;
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 上传
    private static void putObject(File file, String objectName, Credentials credentials) throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        StaticProvider staticProvider = new StaticProvider(credentials.accessKey(), credentials.secretKey(), credentials.sessionToken());
        MinioClient minioClient = MinioClient.builder().endpoint(ENDPOINT).credentialsProvider(staticProvider).build();
        //这个objectName的值是经过上面的policy授权的
        FileInputStream fileInputStream = new FileInputStream(file);
        minioClient.putObject(PutObjectArgs.builder().bucket(BUCKET)
                .object(objectName)
                .contentType("image/jpg")
                .stream(fileInputStream, fileInputStream.available(), -1).build());
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 获得一个 可过期的 URL
    private static String getObjectUrl(String objectName2,Credentials credentials) throws ErrorResponseException, InsufficientDataException, InternalException, InvalidKeyException, InvalidResponseException, IOException, NoSuchAlgorithmException, XmlParserException, ServerException {
        StaticProvider staticProvider = new StaticProvider(credentials.accessKey(), credentials.secretKey(), credentials.sessionToken());
        MinioClient minioClient = MinioClient.builder().endpoint(ENDPOINT).credentialsProvider(staticProvider).build();
        String url =
                minioClient.getPresignedObjectUrl(
                        GetPresignedObjectUrlArgs.builder()
                                .method(Method.GET)
                                .bucket(BUCKET)
                                .object(objectName2)
                                .expiry(2, TimeUnit.HOURS) //过期时间
                                //.extraQueryParams(reqParams)
                                .build());
        System.out.println(url);
        return url;
    }

五、参考:

https://blog.csdn.net/yilvqingtai/article/details/126059858 https://min.io/docs/minio/linux/developers/java/API.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MinIO服务部署指南
‌‌MinIO是一个基于‌Apache License v2.0开源协议的对象存储服务‌,它兼容‌亚马逊S3云存储服务接口,非常适合存储大容量非结构化的数据,如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,文件大小可以从几KB到最大5TB不等
ma布
2024/10/30
4220
MinIO服务部署指南
手把手教你SpringBoot轻松整合Minio实现文件上传下载
前面我们介绍了什么是分布式存储系统,介绍了什么是MinIO,最后如何使用MinIO构建分布式文件系统。那么怎么在实际的项目中使用MinIO呢?接下来就手把手教你如何在SpringBoot中轻松整合MinIO 。
章为忠学架构
2023/10/06
5.4K0
手把手教你SpringBoot轻松整合Minio实现文件上传下载
一个简单易用的文件上传方案
现在 OSS 服务算是一个基础服务了,很多云服务厂商都有提供这样的服务,价格也不贵,松哥自己的 www.javaboy.org 用的就是类似的服务。 不过对于中小公司来说,除了购买 OSS 服务之外,也可以自己搭建专业的文件服务器,自己搭建专门的文件服务器的话,曾经比较专业的做法是 FastDFS,松哥之前也专门为之录过视频发在 B 站上,感兴趣的小伙伴可以自行查看。不过 FastDFS 搭建比较麻烦,非常容易出错,所以对各位小伙伴来说多多少少有一点门槛。 松哥在之前的文章录制的一些项目视频中,如果涉及到文
江南一点雨
2022/04/21
1.5K0
一个简单易用的文件上传方案
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心,而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。
别惹CC
2025/03/05
5011
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
Spring Boot + MinIO 实现文件切片极速上传技术
在现代Web应用中,文件上传是一个常见的需求,尤其是对于大文件的上传,如视频、音频或大型文档。为了提高用户体验和系统性能,文件切片上传技术逐渐成为热门选择。本文将介绍如何使用Spring Boot和MinIO实现文件切片极速上传技术,通过将大文件分割成小片段并并行上传,显著提高文件上传速度。
IT_陈寒
2023/12/20
2.5K0
Spring Boot + MinIO 实现文件切片极速上传技术
springboot集成minio,docker部署
知识浅谈
2023/09/25
3620
Springboot3 + Minio + 腾讯混元助手 做一个网盘(一)
Bucket 英文直译就是桶,就开发角度来说,一个用户有多个桶,每个桶存放不同类型的数据。这就像你的c盘放系统,D盘放学习资料,E盘放开发工程一样。当然也可以都放一个盘。
花花Binki
2023/09/21
9300
Springboot3 + Minio + 腾讯混元助手 做一个网盘(一)
SpringBoot 整合 Minio
MinIO 是一个基于 Go 实现的高性能、兼容 S3 协议的对象存储。它采用 GNU AGPL v3 开源协议,项目地址是 https://github.com/minio/minio 。
默存
2023/09/01
5700
SpringBoot 整合 Minio
springboot整合minio
accessKey和secretKey需要根据启动的窗口上的值进行配置bucketName这个需要自己创建
java后端指南
2022/02/23
1.3K0
springboot整合minio
如何使用Spring Boot和MinIO实现文件上传、读取、下载和删除的功能?
在现代Web应用程序开发中,文件的上传、读取、下载和删除是非常常见的功能。Spring Boot 是一个流行的Java框架,而MinIO则是一个高性能的对象存储服务。本文将详细介绍如何使用Spring Boot和MinIO实现文件上传、读取、下载和删除的功能。
网络技术联盟站
2023/07/03
5.7K0
如何使用Spring Boot和MinIO实现文件上传、读取、下载和删除的功能?
使用Minio搭建一个简单的文件服务系统
使用docker获取Minio镜像 docker pull minio/minio:latest 运行 docker run -d -p 9000:9000 \ --name filesystem -v /usr/local/gps/data:/data \ -v /usr/local/gps/config:/root/.minio \ minio/minio server /data 另外可以设置登录的账号密码 -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7
用户1215919
2021/12/28
8860
使用Minio搭建一个简单的文件服务系统
SpringBoot 2.x 开发案例之整合MinIo文件服务
在之前的图床开发中撸主曾使用了分布式文件服务FASTDFS和阿里云的OSS对象存储来存储妹子图。奈何OSS太贵,FASTDFS搭建配置又太繁琐,今天给大家推荐一款极易上手的高性能对象存储服务MinIO 。
小柒2012
2020/05/09
5.8K0
SpringBoot 2.x 开发案例之整合MinIo文件服务
写给大忙人看的 – Java中上传文件MinIO服务器(2)
上一篇 写给大忙人看的 – 搭建文件服务器 MinIO(一),我们已经成功地搭建了 MinIO 文件服务器,这一篇讲解在 Java 中如何上传文件至 MinIO
全栈程序员站长
2022/09/05
1.1K0
Spring Boot集成MinIO
在Spring Boot项目中集成MinIO(一个高性能的分布式对象存储服务)是一个相对简单的过程。以下是一个详细的步骤指南,帮助你完成这个集成。
科技新语
2024/12/02
3940
Spring Boot集成MinIO
SpringBoot整合Minio 项目中使用自己文件存储服务器
minio介绍: MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。 史上最详细Docker安装Minio
宁在春
2022/10/31
2.5K0
SpringBoot整合Minio 项目中使用自己文件存储服务器
Spring Boot整合MinIO实现文件上传和下载
家人们啦!,上篇文章了,我们讲了如何使用docker-compose快速部署MinIO,在今天的文章中,我将向大家介绍如何将Spring Boot与MinIO进行无缝整合,以便高效地管理和操作文件存储。通过这个整合,你将能够轻松地在Spring Boot应用程序中实现文件的上传和下载等功能。让我们开始吧
修己xj
2023/08/25
1.1K0
Spring Boot整合MinIO实现文件上传和下载
分布式文件系统MinIO
我们的系统离不开文件存储系统,因为系统会存储各种文件,所以选择一个好的文件存储系统是十分有必要的,我们选择文件系统一般需要看其使用是否简单,是否可靠,对各种环境是否适配,社区是否活跃,分布式等,随着云的普及,现在很多云厂商提供了文件存储服务,我们成为OSS,我们的文件由云厂商进行托管,我们只需要按时按量付费,这就是SAAS模式,使用OSS,那么自然得付费,加上文件是存储在别人家,对于很多行业来说,文件得存储在自己的网络,所以OSS自然不行,所以我们得搭建自己的文件服务器,常见的分布式文件服务器有HDFS,FastDFS等,不过对于HDFS,FastDFS,他们的学习成本有点高,加上随着云原生的普及,可能就不太适合我们现在使用,所以我们就说到了MinIO。
小四的技术之旅
2022/07/26
5K0
分布式文件系统MinIO
在Java中使用MinIO:实现对象存储的便捷与高效
随着云计算和大数据技术的快速发展,对象存储已成为现代应用架构中不可或缺的一部分。MinIO是一个高性能、开源的对象存储服务器,兼容Amazon S3 API,非常适合用于存储大量非结构化数据。本文将详细介绍如何在Java中使用MinIO,帮助开发者快速上手并充分利用其强大的功能。
Front_Yue
2024/10/12
1.7K0
在Java中使用MinIO:实现对象存储的便捷与高效
记对象存储服务——Minio的使用
上面实例中,采用此方法上传的文件,不论图片还是文本,在存储桶中展示均为灰色的文件,这样会导致外联会直接下载文件,从而起不到预览的效果,如下图标红所示:
吐吐吐吐吐葡萄皮
2019/04/04
15.5K3
记对象存储服务——Minio的使用
SpringBoot 整合 Mini
这里把MinioClient注入到Bean中,后续使用MinioClient调用Minio的API。
阿珍
2024/10/28
1670
SpringBoot 整合 Mini
相关推荐
MinIO服务部署指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验