【避坑】minio临时凭证STS实现上传,下载

2023-10-29

一、背景

以minio作为图床,采用用户到minio服务器的点对点使用方式,将上传用户的长期凭证放在客户端(app或者web端)带来极大的风险。通常通过临时凭证STS签名的方式实现。简单的逻辑关系图如下:

二、minio服务docker安装

比较简单,我把docker-compose.yaml配置文件贴出来

jeecg-boot-minio:
    image: minio/minio:latest
    networks:
      - jeecglocalhost
    container_name: jeecg-boot-minio
    ports:
      - "9001:9001"
      - "9000:9000"
    restart: always
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: lizzminio
      MINIO_ROOT_PASSWORD: lizzminio #大于等于8位
      TZ: Asia/Shanghai
    logging:
      options:
        max-size: "50M" # 最大文件上传限制
        max-file: "10"
      driver: json-file
    volumes:
      #宿主机是window:D:/dockerFile/dockerdata/minio/data
      #宿主机是Linux:/dockerFile/dockerdata/minio/data
      - /dockerFile/dockerdata/minio/data:/data # 映射文件路径

配置中一定要加上时区设置,保证宿主机和docker时区一致。

中文操作文档:Java Client API参考文档 - MinIO 帮助文档 - 开发文档 - 文江博客

官网操作文档:MinIO | The MinIO Quickstart Guide

三、实践操作

通过搜索资料和官方文档,大概确定了两种配置实现方式。(1)mc客户端+aws配置工具,实际上命令行的方式(2)minio控制台面板配置,实际上通过界面的形式。 网络上大量充斥第一种方式,对于初学者,会觉得麻烦,无法直观理解。我把自己通过第二种方式效果罗列出来,供大家参考。

(1)mc客户端+aws配置工具

这种网上资料比较多,大概就是先安装mc客户端(mc啥意思,可以去官网看看),aws就是用来获取minio sts配置结果的工具。

第一步:在运维机器或者minio的宿主机器上安装MC客户端和AWS应用

(1)安装aws

//下载安装包
 
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.0.30.zip" -o "awscliv2.zip"
 
//解压文件
 
unzip awscliv2.zip
 
//安装,root用户sudo可以去掉
 
sudo ./aws/install

(2)安装mc客户端

//在当前目录下载mc
 
wget https://dl.min.io/client/mc/release/linux-amd64/mc
 
//设置为可执行
 
chmod +x mc
 
//在本目录执行mc命令,查看mc提供的操作命令
 
./mc --help

第二步:mc连接或者说绑定minio服务

minio的ip和端口号,minio的用户名和密码,local表示配置本地服务


./mc config host add local http://127.0.0.1:9000 username password

 配置完成之后可以在~/.mc/config.json中查看,local配置好了本地的minio服务

cat  ~/.mc/config.json

第三步:利用mc创建用户

为local的minio服务创建一个用户:zhaohao,密码:zhaohao123

./mc admin user add local zhaohao   zhaohao123

第四步:利用mc创建策略

首先创建一个json文件

{
    "Version": "2012-10-17",
    "Statement": [
         {
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        }
    ]
}

Version是版本号,Action里是允许使用s3接口的删除、获取上传对象功能

Resource是访问控制,*表示可以访问minio服务的所有bucket,若想限制访问

名为test的bucket可替换成"arn:aws:s3:::test/*" ,表示只可访问名为test的bucket

Action中s3接口数组权限策略。

其次,将json文件绑定到minio服务上

//表示为local的minio服务绑定一个叫testpolicy的访问策略,后面是策略文件的地址

./mc admin policy add local testpolicy /home/mxShop/minio/config/company.json 

查看绑定的策略:./mc admin policy info local minio 

若出现:-bash: ./mc: No such file or directory,需要切换到mc所在目录

第五步:利用mc绑定用户和策略

//将前面的testpolicy策略绑定给zhaohao   用户
 
./mc admin policy set local testpolicy user=zhaohao   

第六步:利用aws进行配置验证

为minio服务绑定完策略后,需要使用aws配置该策略

aws configure --profile testpolicy

执行完上面命令后需要进行配置:

minio用户的信息
AWS Access Key ID [None]: minio
AWS Secret Access Key [None]: miniopwd
aws服务的站点
Default region name [None]: cn-north-1
第四行是文件类型
Default output format [None]: json

 配置完的信息可在~/.aws目录下进行查看和修改

 第七步:测试

输入以下命令

--profile:指定策略

--prolicy:进行二次策略限制,格式与之前的策略相同

aws --profile minio  \
--endpoint-url 'http://localhost:9000' \
sts assume-role \
--policy '{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": ["s3:GetObject"],"Resource": ["arn:aws:s3:::*"]}]}' --role-arn 'arn:aws:s3:::*' \
--role-session-name anything

 结果:这些就是我们需要的签名信息了

{
    "Credentials": {
        "AccessKeyId": "JJOUBSPDSK20Y2500847",
        "SecretAccessKey": "QpXMeXQHE+qYGddh5On+DlWYXpenK+j5yOHBn4Hm",
        "SessionToken": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NLZXkiOiJKSk9VQlNQRFNLMjBZMjUwMDg0NyIsImV4cCI6MTY0MTg5NTQxNiwicGFyZW50IjoibWluaW8iLCJzZXNzaW9uUG9saWN5IjoiZXlKV1pYSnphVzl1SWpvZ0lqSXdNVEl0TVRBdE1UY2lMQ0pUZEdGMFpXMWxiblFpT2lCYmV5SkZabVpsWTNRaU9pQWlRV3hzYjNjaUxDSkJZM1JwYjI0aU9pQmJJbk16T2tkbGRFOWlhbVZqZENKZExDSlNaWE52ZFhKalpTSTZJRnNpWVhKdU9tRjNjenB6TXpvNk9pb2lYWDFkZlE9PSJ9.Gt2I3TG0jpvApAQrrS1QEZV0N3cIbtXnbNQ07-qe2cLb-uty-IaiVYhCyUHG80vwqJCxjnHiqYitziMWZna6sg",
        "Expiration": "2022-01-11T10:03:36+00:00"
    },
    "AssumedRoleUser": {
        "Arn": ""
    }
}

(2)minio控制台面板配置

第一步:登录控制面板,创建策略

 

第二步:创建用户,绑定策略

记录自己创建的用户Access Key  Secret Key

 

以上两步就OK了,简单快速

(3)java客户端测试

引入minio sdk

<dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.3.3</version>
 </dependency>
package com.rcgx.util.minio;


import com.rcgx.pay.common.util.DateUtil;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.credentials.AssumeRoleProvider;
import io.minio.credentials.Credentials;
import io.minio.credentials.StaticProvider;
import io.minio.errors.*;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Date;

public class Test03 {
    //服务所在ip地址和端口
    public static final String ENDPOINT = "http://192.168.3.38:9000/";
  
    //mc的用户名
    public static final String ACCESS_KEY_COMPANY = "zhaohao";
    //mc的密码
    public static final String SECRET_KEY_COMPANY = "zhaohao123";
    //aws服务端点
    public static final String REGION = "cn-north-1";
    //上传的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" +
            "}";
    public static void main(String[] args) {
        try {
            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="+com.rcgx.util.DateUtil.getDateTimeFormat(expirationDate));

            Credentials credentials = provider.fetch();
            String sessionToken=provider.fetch().sessionToken();
            String accessKey=provider.fetch().accessKey();
            String secretKey=provider.fetch().secretKey();




            StaticProvider staticProvider = new StaticProvider(credentials.accessKey(), credentials.secretKey(), credentials.sessionToken());
            MinioClient minioClient = MinioClient.builder().endpoint(ENDPOINT).credentialsProvider(staticProvider).build();
            File file = new File("C:\\Users\\zhaohao\\Pictures\\Camera Roll\\人民政府市长办公会议纪要【2018】126号-六、公交场站免于处罚-2018年第4次轨道交通建设50专题例会会议纪要(1)_1645434959808.pdf.png");
            //这个objectName的值是经过上面的policy授权的
            String objectName = "mx/pic1.jpg";
            try {
                FileInputStream fileInputStream = new FileInputStream(file);
                minioClient.putObject(PutObjectArgs.builder().bucket(BUCKET)
                        .object(objectName)
                        .contentType("image/jpg")
                        .stream(fileInputStream, fileInputStream.available(), -1).build());

                File file2 = new File("C:\\Users\\zhaohao\\Pictures\\Camera Roll\\微信截图_20210308150013 - 副本.png");
                //这个objectName的值是经过上面的policy授权的
                String objectName2 = "mx/pic2.jpg";
                FileInputStream fileInputStream2 = new FileInputStream(file2);
                minioClient.putObject(PutObjectArgs.builder().bucket(BUCKET)
                        .object(objectName2)
                        .contentType("image/jpg")
                        .stream(fileInputStream2, fileInputStream2.available(), -1).build());
            } catch (Exception e) {
                e.printStackTrace();
            }


            /*//使用签名获取mc对象
            MinioClient minioClient = MinioClient.builder()
                    .endpoint(ENDPOINT)
                    .credentialsProvider(provider)
                    .build();
            String filename = "github-docker-compose.yml";
            try {
                //对象流,获取文件
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\dockerFile\\" + filename));
                //使用mc对象上传文件
                minioClient.putObject(PutObjectArgs.builder()
                        //桶名和aws服务端点
                        .bucket(BUCKET).region(REGION)
                        //前缀和对象名
                        .object("mx/" + filename)
                        .stream(bis, bis.available(), -1)
                        .build());
                System.out.println("文件上传成功!!");
            } catch (ErrorResponseException e) {
                e.printStackTrace();
            } catch (InsufficientDataException e) {
                e.printStackTrace();
            } catch (InternalException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (InvalidResponseException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ServerException e) {
                e.printStackTrace();
            } catch (XmlParserException e) {
                e.printStackTrace();
            }*/
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

    }
}

运行结果


sessionToken=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NLZXkiOiIyRktYWVYxSExKWTJBNldWMjlUMyIsImV4cCI6MTY1OTUzMzgxNywicGFyZW50Ijoiemhhb2hhbyIsInNlc3Npb25Qb2xpY3kiOiJld29nSWxabGNuTnBiMjRpT2lBaU1qQXhNaTB4TUMweE55SXNDaUFpVTNSaGRHVnRaVzUwSWpvZ1d3b2dJSHNLSUNBZ0lrVm1abVZqZENJNklDSkJiR3h2ZHlJc0NpQWdJQ0pCWTNScGIyNGlPaUJiQ2lBZ0lDQWljek02UjJWMFQySnFaV04wSWl3S0lDQWdJQ0p6TXpwSFpYUkNkV05yWlhSTWIyTmhkR2x2YmlJc0NpQWdJQ0FpY3pNNlVIVjBUMkpxWldOMElnb2dJQ0JkTEFvZ0lDQWlVbVZ6YjNWeVkyVWlPaUJiQ2lBZ0lDQWlZWEp1T21GM2N6cHpNem82T25SbGMzUXZLaUlLSUNBZ1hRb2dJSDBLSUYwS2ZRPT0ifQ.BbwnrFLmUiYdxJN4SpXqtMYQgiKioPx_IT08AUSOAma5CrK5pfqS6WZWOo5LXMbx1nmmv0oz_BegDuuc2PsWoQ
accessKey=2FKXYV1HLJY2A6WV29T3
secretKey=XdXIrKOkA6EBdj9I4SRfe1BNiqPHrhC75xgiPwod
isExpired=false
expirationDate=2022-08-03 21:36:57

Process finished with exit code 0

实际运用可以将accessKey ,secretKey,expirationDate以及其他minio配置通过接口发送给前端 即可实现

四、异常报错解决避坑

(1)如果出现以下错误,通常是策略配上的action中,缺少权限。

(2)但是我看网上很多讲docker容器时区和宿主机时区不一样导致的错误,但是当我把时区调整后,或者直接手动修改docker内时间,保持时间一直后,仍然报这个异常。这个就很容易让人误解,网上的资料不能尽信啊。

比如: minio AccessDenied_隐0士的博客-CSDN博客_accessdenied minio

ErrorResponse(code = AccessDenied, message = Access denied, bucketName = bucket, objectName = null_爱驹一族的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【避坑】minio临时凭证STS实现上传,下载 的相关文章

  • 使用阿里云的函数计算来实现OSS资源的打包下载

    文档地址 xff1a 如何使用函数计算将多个文件打包下载到本地 对象存储 OSS 阿里云 计算函数可以通过对外公网域名进行访问 xff1a 计算函数的参数有几个 xff1a bucket xff1a 使用的OSS的bucket xff0c
  • docker of minio解决浏览器无法访问的问题

    1 拉取镜像 docker pull minio minio 2 启动minio xff0c 动态端口云服务器会改变 docker run span class token punctuation span p 9090 span clas
  • Docker安装Minio

    寻找Minio镜像 Docker Hub 查找官方镜像 下载Minio镜像 下载最新版Minio镜像 span class token function docker span pull minio minio 等同于 span class
  • SpringBoot整合Minio

    1 引入依赖 POM文件如下
  • docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:9090: bind: An attem

    Windows10下使用docker部署minio时报错 命令 docker run p 9090 9000 name minio v mydata minio data data v mydata minio config root mi
  • 【避坑】minio临时凭证STS实现上传,下载

    一 背景 以minio作为图床 采用用户到minio服务器的点对点使用方式 将上传用户的长期凭证放在客户端 app或者web端 带来极大的风险 通常通过临时凭证STS签名的方式实现 简单的逻辑关系图如下 二 minio服务docker安装
  • 阿里云OSS存储

    目录 一 阿里云OSS存储 二 SDK了解 三 Spring Boot集成OSS 一 阿里云OSS存储 对象存储OSS 为了解决海量数据存储与弹性扩容 我们采用云存储的解决方案 1 开通对象存储OSS服务 1 申请阿里云账号 2 实名认证
  • Minio 部署

    minio 官网 https www minio org cn 部署文档 https www minio org cn docs minio container operations install deploy manage deploy
  • 自建minio实现doris的快速备份与恢复

    一 概述 doris支持通过腾讯云bos 阿里云oss hdfs实现备份与恢复 但是我们公司doris部署在线下机房 如采用oss bos 大数据备份与恢复比较慢 会占用一定的带宽 如采用hdfs 担心小文件太多影响现有的hadoop集群
  • OSS服务端签名后直传

    OSS服务端签名后直传 1 阿里云OSS启动器快速上手 1 引入oss starter 1 引入oss starter
  • minio 配置

    文章目录 资源访问 用户和权限 策略 用户 Service Accounts java 连接 minio k8s 部署 minio 资源访问 某些资源例如图片 需要可以直接访问 新建桶 上传一张图片上去 点击桶设置 设置 Access Po
  • SpringBoot整合——阿里云对象存储(OSS)

    SpringBoot整合 阿里云对象存储 1 OSS介绍 在开发应用的过程中 我们经常会有用户需要实名认证之后才能访问的需求 用户认证需要上传证件图片 首页轮播也需要上传图片 因此我们要做文件服务 阿里云oss是一个很好的分布式文件服务系统
  • Typora图床配置详细教程

    Typora图床配置详细教程 从读研开始 慢慢有了写博客的习惯 刚开始直接在csdn上写 后来还是觉得不太方便 有时候上网课记笔记还要另外专门打开一个网页来回切换 于是就改用Typora 不得不说真香 不幸的是 Typora后来走上了收费的
  • 安装登录minio后,页面一直转圈

    报错 WARNING MINIO ACCESS KEY and MINIO SECRET KEY are deprecated Please use MINIO ROOT USER and MINIO ROOT PASSWORD 处理方案
  • 安装登录minio后,页面一直转圈

    报错 WARNING MINIO ACCESS KEY and MINIO SECRET KEY are deprecated Please use MINIO ROOT USER and MINIO ROOT PASSWORD 处理方案
  • 如何在发送给 MinIO 的 REST 请求中进行身份验证

    我正在尝试使用 MinIO 我尝试将 REST API 调用直接发送到 MinIO 端口 9000 到目前为止 我了解到身份验证的工作方式与 Amazon S3 API 身份验证的工作方式相同 对吗 不幸的是 我也是 S3 的新手 这是我的
  • 使用生成的预签名 url 将文件上传到 minio 的请求中缺少字段

    我使用 Minio Server 来处理 Nodejs API 中的文件 基本上是在本地模拟 s3 我生成了 Presigned Url 来直接上传图像 Presign Url Generation 工作正常 但是当我从 Postman 上
  • Minio:使用 docker-compose 添加公共存储桶

    下面是我的 docker compose 中的一个服务 minio image minio minio edge environment MINIO ACCESS KEY minio123 MINIO SECRET KEY minio123
  • Minio 安装在 Traefik 后面

    我有以前的版本 去年的 minio远远落后traefik and on portainer没有任何问题 我四天前尝试升级到新版本 但从那时起它就一直在走下坡路 我收到登录页面 但它不接受凭据 错误 code 500 detailedMess
  • AWS SDK S3 node.js 连接到本地 MinIO 服务器

    我有用 Node js 编写的应用程序服务器 它将文件上传到 AWS S3 存储 为此我正在使用https www npmjs com package aws sdk https www npmjs com package aws sdk当

随机推荐

  • @Scope作用域代理的应用:@RefreshScope注解实现动态刷新配置的底层原理与实现

    RefreshScope这个注解存在于spring cloud context规范包中 它的作用就是允许在服务运行的过程中 在加了 Value注解的类上加上 RefreshScope注解 那么这个属性就能够实时地动态刷新其属性值 通常用于服
  • C++11之 unique_ptr

    原文地址为 http www drdobbs com cpp c11 uniqueptr 240002708 在C 11中加入了很多的新特性 unique ptr一枝独秀 对于动态分配的内存对象 它简单有效 虽然它不是万能的 但是它做的已经
  • Java 并发编程中篇 -(JMM、CAS 原理、Volatile 原理)

    并发编程已完结 章节如下 Java 并发编程上篇 Synchronized 原理 LockSupport 原理 ReentrantLock 原理 Java 并发编程中篇 JMM CAS 原理 Volatile 原理 Java 并发编程下篇
  • java实现机房存活主机多线程实现

    主要使用java原生开发 实现多线程ping 在扫描存活主机时能够减少ping的时间提高运行效率 已完成课程设计代码上传中 2022 5 5
  • MySQL最终弹-并发(脏读,不可重复读,幻读及区别),JDBC的使用和安装,最全万字

    一 并发基本概念 并发的基本意思 什么是并发呢 简单的理解就是同一时间执行 服务器同一时刻 给多个客户端提供服务 这两个客户端都可以给服务器提交事务 如果提交两个事务 改不同的表还没啥影响 假如要改相同的表 这时候可能会出现麻烦 二 脏读
  • ubuntu下protobuf安装使用(详解)

    1 安装 1 1安装前的环境 以下几个库都有安装 sudo apt get install autoconf automake libtool curl make g unzip 1 2安装 注意 以下命令在超级用户下执行 sudo apt
  • 机器学习(Machine Learning)&深度学习(Deep Learning)资料

    机器学习 Machine Learning 深度学习 Deep Learning 资料 Chapter 1 注 机器学习资料 篇目一 https github com ty4z2008 Qix blob master dl md 共500条
  • linux中主线程退出后子线程的状态

    1 运行如下代码 即是简单创建一个子线程 主线程直接结束 然后在子线程中每间隔一秒就打印一个HELLO 利用ps ef查看进程状态 发现没有主线程和子线程都不在 即是主线程退出后子线程也会退出 2 运行如下代码 增加利用pthread ex
  • js动态添加与删除ul中的li

    方法一 createElement li 方式方法二 innerHTML方式方法一实例 参考 http zhidao baidu com question 175951279 html
  • 2021-02-05

    一个 C 转 GO 的程序员的自白 GO 一个文件下载过滤需求 var file been found lock sync Mutex var file been found map string int make map string i
  • 我的 PhpStorm 设置

    可能因为 PhpStorm 版本不同的原因 你找不到如下设置的地点 此时可以在设置界面搜索设置项的关键字 软件字体 进入设置 Settings gt Appearance Behavior gt Appearance 勾选Override
  • 华为OD机试真题 Java 实现【报数游戏】【2022Q4 100分】

    一 题目描述 100个人围成一圈 每个人有一个编码 编号从1开始到100 他们从1开始依次报数 报到为M的人自动退出圈圈 然后下一个人接着从1开始报数 直到剩余的人数小于M 请问最后剩余的人在原先的编号为多少 二 输入描述 输入一个整数参数
  • SQL基本的表修改及其它命令

    对于已经建好的表 有时可能因为业务的变动或者设计时考虑的不周全而需要进行列的调整 包 括增加一个新的列 修改一个列 为列定义一个缺省值 删除一个列等 对应语句语法分别如下 ALTER TABLE table ADD column datat
  • pytorch中一维卷积conv1d,参数含义,为何转置

    pytorch中一维卷积conv1d 参数含义 为何转置 在Pytorch中 一维卷积是一种非常常用的运算 但是对于刚刚入门的新手 了解此函数的用法仍是一个比较费力的挑战 本文简单介绍一下此函数的常用参数的意义以及此函数的用法 链接 cov
  • Node.js 利用高阶函数 ( 柯里化 ) 并发写入流、读取流(Stream)

    首先 介绍Stream实例对象的方法 data 读数据时触发 end 数据读取完毕时触发 error 在接收和写入过程中发生错误时触发 finish 所有数据已被写入到底层系统时触发 今天 我们利用node对stream对象的支持 利用高阶
  • 在Windows下使用Anaconda安装TesnsorFlow 2.x

    作者 弗拉德 来源 弗拉德 公众号 fulade me 下载 Anaconda 首先打开Anaconda官网找到网页底部 由于最新的Anaconda支持Python3 8版本 而TesnorFlow最高支持到Python3 7 我特意查了一
  • java.lang.IllegalStateException: Failed to load ApplicationContext

    问题描述 mvn clean install的时候报的如下异常 紧接着又往下翻了一下日志还有一个这个错误 按正常来说通过 可以取pom当中的properties标签的值呀 但是可以发现编译过后的application当中的值并没有被替换 解
  • 2022年最新版黑马程序员Java学习路线

    工欲善其事 必先利其器 自学Java的同学 必备的自学五部曲 学习路线图 学习教程 工具 书籍 面试 一 Java学习路线图 学习路线图说明 二 学习教程推荐 阶段一Java基础 具备Java语言编程基础和IO 多线程 网络编程等开发能力
  • Zstack 挂载云盘,在Windows下面看不到解决方法

    原因 在使用 Zstack 私有云时 创建 WinServer2019 时 想添加一块数据云盘 但是添加好后 进入系统看不到硬盘 主要是因为添加的云盘驱动是 virtio 格式 所以要安装相关驱动 1 查看挂载的云盘 root zstack
  • 【避坑】minio临时凭证STS实现上传,下载

    一 背景 以minio作为图床 采用用户到minio服务器的点对点使用方式 将上传用户的长期凭证放在客户端 app或者web端 带来极大的风险 通常通过临时凭证STS签名的方式实现 简单的逻辑关系图如下 二 minio服务docker安装