自己撸一套验权,需要支持S3V4认证协议

2023-12-13 21:44

本文主要是介绍自己撸一套验权,需要支持S3V4认证协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、核心代码很简单,就下面这些:

String Authorization = request.getHeader("Authorization");String xamzdate = request.getHeader("x-amz-date");String Host = request.getHeader("Host");log.info("S3协议方式,minio请求,url={},Authorization={},xamzdate={},Host={}",request.getRequestURI(),Authorization,xamzdate,Host);if(StringUtils.isBlank(Authorization) || StringUtils.isBlank(xamzdate) || StringUtils.isBlank(Host)){throw new HttpException(ErrorsEnum.AUTH_FAIL);}// 获取用户的keyString[] Authorizations = Authorization.split(" ");String sha256 = Authorizations[0];String Credential = Authorizations[1];String SignedHeader = Authorizations[2];String Signature = Authorizations[3];if(!"AWS4-HMAC-SHA256".equals(sha256) || StringUtils.isBlank(Credential) || StringUtils.isBlank(SignedHeader) || StringUtils.isBlank(Signature)){throw new HttpException(ErrorsEnum.AUTH_FAIL);}// 获取用户名String ck = Credential.substring(Credential.indexOf("=")+1,Credential.indexOf("/"));String regin = Credential.split("/")[Credential.split("/").length-3];String servicename  = Credential.split("/")[Credential.split("/").length-2];// 计算auth// for a simple GET, we have no body so supply the precomputed 'empty' hash// 计算signedHeadersString[] SignedHeaders = SignedHeader.substring(SignedHeader.indexOf("=")+1,SignedHeader.length()-1).split(";");Map<String, String> headers = new HashMap<String, String>();for (String signedHeader : SignedHeaders) {headers.put(signedHeader,request.getHeader(signedHeader));}/* headers.put("x-amz-content-sha256", AWS4SignerBase.EMPTY_BODY_SHA256);headers.put("x-amz-date",xamzdate);*/String url = host  + request.getRequestURI();URL endpointUrl = new URL(url);AWS4SignerForAuthorizationHeader signer = new AWS4SignerForAuthorizationHeader(endpointUrl, request.getMethod(), servicename, regin);String authorization = signer.computeSignature(headers,null, // no query parametersheaders.get("x-amz-content-sha256"),clientInfo.getClientKey(),clientInfo.getClientSecret());log.info("S3协议方式,签名校验,SignedHeaders={},authorization={}",headers.toString(),authorization);if(!Authorization.equals(authorization)){throw new HttpException(ErrorsEnum.AUTH_FAIL);}

但是里面的弯弯绕绕也太多了。

2、相关参考资料

处理Amazon S3对象 - AWS SDK for Java 2.x

aws-doc-sdk-examples/javav2/example_code/s3/src/main/java/com/example/s3/S3ObjectOperations.java at main · awsdocs/aws-doc-sdk-examples · GitHub

Amazon S3 的 java sdk简单使用_aws-java-sdk-CSDN博客

Authenticating Requests: Using the Authorization Header (AWS Signature Version 4) - Amazon Simple Storage Service

Signature Calculations for the Authorization Header: Transferring Payload in Multiple Chunks (Chunked Upload) (AWS Signature Version 4) - Amazon Simple Storage Service

aws-doc-sdk-examples/javav2/example_code/s3/src/main/java/com/example/s3/PutObject.java at main · awsdocs/aws-doc-sdk-examples · GitHubGitHub - aws/aws-sdk-java-v2: The official AWS SDK for Java - Version 2Maven Repository: software.amazon.awssdk » aws-sdk-java » 2.21.42 (mvnrepository.com)

3、配合使用

1、我们先搞个系统,导入pom

<!-- https://mvnrepository.com/artifact/software.amazon.awssdk/aws-sdk-java -->
<dependency><groupId>software.amazon.awssdk</groupId><artifactId>aws-sdk-java</artifactId><version>2.21.42</version><scope>provided</scope>
</dependency>

2、写个测试类:

package kf;import com.alibaba.fastjson.JSONObject;import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.junit.jupiter.api.Test;import java.io.File;
import java.math.BigInteger;
import java.net.URI;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProviderChain;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.S3ClientBuilder;
import software.amazon.awssdk.services.s3.S3Configuration;
import software.amazon.awssdk.services.s3.endpoints.S3EndpointProvider;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3control.model.Credentials;class testS3 {@Testvoid test() {S3Client s3 = S3Client.builder().credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("eda", "eda123456"))).region(Region.US_EAST_1).endpointOverride(URI.create("http://localhost:8810/openapi/minio/")).serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(false).chunkedEncodingEnabled(false).build()).build();// 验证成功
//        s3.getObject(GetObjectRequest.builder().bucket("client_1").key("/20231201/2023120110242247663528991.jpg").build());// 验证上传s3.putObject(PutObjectRequest.builder().bucket("client_1").key("test.jpg").build(), RequestBody.fromFile(new File("D:\\pb\\Pictures\\test.jpg")));
//        System.out.println(s3.listBuckets());}}

先测试获取文件和上传文件吧。

3、在自己需要验签的系统里,添加上面的核心代码,我这边是用切面处理的。

4、实现相关getObject、putObject等相关功能

底层可以自己打通,这样,相关的文件服务中台就ok了

ps:官方的demo里面是有bug的哦,请自己谨慎处理

这篇关于自己撸一套验权,需要支持S3V4认证协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/490083

相关文章

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(