From 1c4af4cc0313735b6275a9d0e36029c8e621046c Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Sun, 9 Mar 2025 19:44:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20API=20=E5=8F=82=E6=95=B0=E7=AD=BE?= =?UTF-8?q?=E5=90=8D=E9=85=8D=E7=BD=AE=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=91=98=E8=A6=81=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/dev33/satoken/config/SaSignConfig.java | 107 ++++++++++++++---- .../cn/dev33/satoken/sign/SaSignTemplate.java | 16 +-- .../cn/dev33/satoken/sign/SaSignUtil.java | 7 +- .../src/main/resources/application.yml | 3 + 4 files changed, 103 insertions(+), 30 deletions(-) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaSignConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaSignConfig.java index 995ab523..eb099707 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaSignConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaSignConfig.java @@ -15,6 +15,10 @@ */ package cn.dev33.satoken.config; +import cn.dev33.satoken.exception.SaTokenException; +import cn.dev33.satoken.fun.SaParamRetFunction; +import cn.dev33.satoken.secure.SaSecureUtil; + /** * Sa-Token API 接口签名/验签 相关配置类 * @@ -36,6 +40,10 @@ public class SaSignConfig { */ private long timestampDisparity = 1000 * 60 * 15; + /** + * 对 fullStr 的摘要算法 + */ + private String digestAlgo = "md5"; public SaSignConfig() { } @@ -48,6 +56,70 @@ public class SaSignConfig { this.secretKey = secretKey; } + + // -------------- 扩展方法 + + /** + * 计算保存 nonce 时应该使用的 ttl,单位:秒 + * @return / + */ + public long getSaveNonceExpire() { + // 如果 timestampDisparity >= 0,则 nonceTtl 的值等于 timestampDisparity 的值,单位转秒 + if(timestampDisparity >= 0) { + return timestampDisparity / 1000; + } + // 否则,nonceTtl 的值为 24 小时 + else { + return 60 * 60 * 24; + } + } + + + // -------------- 策略函数 + + /** + * 对 fullStr 的摘要算法函数 + */ + public SaParamRetFunction digestMethod = (fullStr) -> { + // md5 + if(digestAlgo.equalsIgnoreCase("md5")) { + return SaSecureUtil.md5(fullStr); + } + // sha1 + if(digestAlgo.equalsIgnoreCase("sha1")) { + return SaSecureUtil.sha1(fullStr); + } + // sha256 + if(digestAlgo.equalsIgnoreCase("sha256")) { + return SaSecureUtil.sha256(fullStr); + } + // sha384 + if(digestAlgo.equalsIgnoreCase("sha384")) { + return SaSecureUtil.sha384(fullStr); + } + // sha512 + if(digestAlgo.equalsIgnoreCase("sha512")) { + return SaSecureUtil.sha512(fullStr); + } + // 未知 + throw new SaTokenException("不支持的摘要算法:" + digestAlgo + ",你可以自定义摘要算法函数实现"); + }; + + /** + * 设置: 对 fullStr 的摘要算法函数 + * + * @param digestMethod / + * @return 对象自身 + */ + public SaSignConfig setDigestMethod(SaParamRetFunction digestMethod) { + this.digestMethod = digestMethod; + return this; + } + + + + // -------------- get/set + /** * 获取 API 调用签名秘钥 * @@ -95,18 +167,22 @@ public class SaSignConfig { } /** - * 计算保存 nonce 时应该使用的 ttl,单位:秒 + * 获取 对 fullStr 的摘要算法 + * + * @return digestAlgo 对 fullStr 的摘要算法 + */ + public String getDigestAlgo() { + return this.digestAlgo; + } + + /** + * 设置 对 fullStr 的摘要算法 + * @param digestAlgo / * @return / */ - public long getSaveNonceExpire() { - // 如果 timestampDisparity >= 0,则 nonceTtl 的值等于 timestampDisparity 的值,单位转秒 - if(timestampDisparity >= 0) { - return timestampDisparity / 1000; - } - // 否则,nonceTtl 的值为 24 小时 - else { - return 60 * 60 * 24; - } + public SaSignConfig setDigestAlgo(String digestAlgo) { + this.digestAlgo = digestAlgo; + return this; } @Override @@ -117,15 +193,4 @@ public class SaSignConfig { + "]"; } - /** - * 设置:是否校验 nonce 随机字符串 - *

isCheckNonce 方案已废弃,不再提供此配置项

- * - * @param isCheckNonce / - */ - @Deprecated - public void setIsCheckNonce(Boolean isCheckNonce) { - System.err.println("--------- isCheckNonce 方案已废弃,不再提供此配置项 ---------"); - } - } \ No newline at end of file diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/sign/SaSignTemplate.java b/sa-token-core/src/main/java/cn/dev33/satoken/sign/SaSignTemplate.java index 4ea4f9d4..58cdea26 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/sign/SaSignTemplate.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/sign/SaSignTemplate.java @@ -20,7 +20,6 @@ import cn.dev33.satoken.config.SaSignConfig; import cn.dev33.satoken.context.model.SaRequest; import cn.dev33.satoken.error.SaErrorCode; import cn.dev33.satoken.exception.SaSignException; -import cn.dev33.satoken.secure.SaSecureUtil; import cn.dev33.satoken.util.SaFoxUtil; import java.util.Map; @@ -173,7 +172,7 @@ public class SaSignTemplate { // 计算签名 String paramsStr = joinParamsDictSort(paramsMap); String fullStr = paramsStr + "&" + key + "=" + secretKey; - String signStr = abstractStr(fullStr); + String signStr = digestFullStr(fullStr); // 输入日志,方便调试 log.debug("fullStr:{}", fullStr); @@ -188,8 +187,8 @@ public class SaSignTemplate { * @param fullStr 待摘要的字符串 * @return 签名 */ - public String abstractStr(String fullStr) { - return SaSecureUtil.md5(fullStr); + public String digestFullStr(String fullStr) { + return getSignConfigOrGlobal().digestMethod.run(fullStr); } /** @@ -281,7 +280,7 @@ public class SaSignTemplate { } /** - * 判断:给定的参数 + 秘钥 生成的签名是否为有效签名 + * 判断:给定的参数 生成的签名是否为有效签名 * @param paramsMap 参数列表 * @param sign 待验证的签名 * @return 签名是否有效 @@ -292,7 +291,7 @@ public class SaSignTemplate { } /** - * 校验:给定的参数 + 秘钥 生成的签名是否为有效签名,如果签名无效则抛出异常 + * 校验:给定的参数 生成的签名是否为有效签名,如果签名无效则抛出异常 * @param paramsMap 参数列表 * @param sign 待验证的签名 */ @@ -349,6 +348,9 @@ public class SaSignTemplate { // 通过 √ } + + // ----------- Web 请求相关 封装 + /** * 判断:一个请求中的 nonce、timestamp、sign 是否均为合法的 * @param request 待校验的请求对象 @@ -382,7 +384,7 @@ public class SaSignTemplate { * @param paramNames 指定的参数名称,不可为空,如果传入空数组则代表只拿 timestamp、nonce、sign 三个参数 * @return 提取出的参数 */ - public Map takeRequestParam(SaRequest request, String [] paramNames) { + protected Map takeRequestParam(SaRequest request, String [] paramNames) { Map paramMap = new TreeMap<>(); // 此三个参数是必须获取的 diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/sign/SaSignUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/sign/SaSignUtil.java index 5d7a175c..de29e6b5 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/sign/SaSignUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/sign/SaSignUtil.java @@ -119,7 +119,7 @@ public class SaSignUtil { } /** - * 判断:给定的参数 + 秘钥 生成的签名是否为有效签名 + * 判断:给定的参数 生成的签名是否为有效签名 * @param paramsMap 参数列表 * @param sign 待验证的签名 * @return 签名是否有效 @@ -129,7 +129,7 @@ public class SaSignUtil { } /** - * 校验:给定的参数 + 秘钥 生成的签名是否为有效签名,如果签名无效则抛出异常 + * 校验:给定的参数 生成的签名是否为有效签名,如果签名无效则抛出异常 * @param paramsMap 参数列表 * @param sign 待验证的签名 */ @@ -154,6 +154,9 @@ public class SaSignUtil { SaManager.getSaSignTemplate().checkParamMap(paramMap); } + + // ----------- Web 请求相关 封装 + /** * 判断:一个请求中的 nonce、timestamp、sign 是否均为合法的 * @param request 待校验的请求对象 diff --git a/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml index 92a664b2..e9416043 100644 --- a/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml @@ -18,6 +18,9 @@ sa-token: token-style: uuid # 是否输出操作日志 is-log: true + sign: + # token签名密钥 + secret-key: abc123 spring: # redis配置