自己撸一套验权,需要支持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

相关文章

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

SpringSecurity6.0 如何通过JWTtoken进行认证授权

《SpringSecurity6.0如何通过JWTtoken进行认证授权》:本文主要介绍SpringSecurity6.0通过JWTtoken进行认证授权的过程,本文给大家介绍的非常详细,感兴趣... 目录项目依赖认证UserDetailService生成JWT token权限控制小结之前写过一个文章,从S

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优