From b23aa55ffaba08ddd52d1d47109f157da0b73413 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Wed, 8 May 2024 17:21:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20checkTicketAppendData=20?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E5=87=BD=E6=95=B0=EF=BC=8C=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E5=9C=A8=E6=A0=A1=E9=AA=8C=20ticket=20=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E7=BB=99=20sso-client=20=E7=AB=AF=E8=BF=BD=E5=8A=A0=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../satoken/sso/config/SaSsoClientConfig.java | 2 +- .../satoken/sso/config/SaSsoServerConfig.java | 8 +++ .../CheckTicketAppendDataFunction.java | 34 +++++++++++++ .../function/TicketResultHandleFunction.java | 10 ++-- .../sso/model/SaCheckTicketResult.java | 51 +++++++++++++++++++ .../sso/processor/SaSsoClientProcessor.java | 26 +++------- .../sso/processor/SaSsoServerProcessor.java | 8 +-- 7 files changed, 110 insertions(+), 29 deletions(-) create mode 100644 sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/function/CheckTicketAppendDataFunction.java create mode 100644 sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/model/SaCheckTicketResult.java diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/config/SaSsoClientConfig.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/config/SaSsoClientConfig.java index ccdf9c73..dd7d4a3d 100644 --- a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/config/SaSsoClientConfig.java +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/config/SaSsoClientConfig.java @@ -345,7 +345,7 @@ public class SaSsoClientConfig implements Serializable { // -------------------- 所有回调函数 -------------------- /** - * SSO-Client端:自定义校验Ticket返回值的处理逻辑 (每次从认证中心获取校验Ticket的结果后调用) + * SSO-Client端:自定义校验 ticket 返回值的处理逻辑 (每次从认证中心获取校验 ticket 的结果后调用) *

参数:loginId, back *

返回值:返回给前端的值 */ diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/config/SaSsoServerConfig.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/config/SaSsoServerConfig.java index 1830962f..47aa280f 100644 --- a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/config/SaSsoServerConfig.java +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/config/SaSsoServerConfig.java @@ -18,6 +18,7 @@ package cn.dev33.satoken.sso.config; import cn.dev33.satoken.sso.error.SaSsoErrorCode; import cn.dev33.satoken.sso.exception.SaSsoException; +import cn.dev33.satoken.sso.function.CheckTicketAppendDataFunction; import cn.dev33.satoken.sso.function.DoLoginHandleFunction; import cn.dev33.satoken.sso.function.NotLoginViewFunction; import cn.dev33.satoken.sso.function.SendHttpFunction; @@ -279,6 +280,13 @@ public class SaSsoServerConfig implements Serializable { return SaResult.error(); }; + /** + * SSO-Server端:在校验 ticket 后,给 sso-client 端追加返回信息的函数 + */ + public CheckTicketAppendDataFunction checkTicketAppendData = (loginId, result) -> { + return result; + }; + /** * SSO-Server端:发送Http请求的处理函数 */ diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/function/CheckTicketAppendDataFunction.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/function/CheckTicketAppendDataFunction.java new file mode 100644 index 00000000..b99bb802 --- /dev/null +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/function/CheckTicketAppendDataFunction.java @@ -0,0 +1,34 @@ +/* + * Copyright 2020-2099 sa-token.cc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.dev33.satoken.sso.function; + +import cn.dev33.satoken.util.SaResult; + +import java.util.function.BiFunction; + +/** + * 函数式接口:SSO-Server端:在校验 ticket 后,给 sso-client 端追加返回信息的函数 + * + *

参数:loginId, SaResult 响应参数对象

+ *

返回:SaResult 响应参数对象

+ * + * @author click33 + * @since 1.38.0 + */ +@FunctionalInterface +public interface CheckTicketAppendDataFunction extends BiFunction { + +} \ No newline at end of file diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/function/TicketResultHandleFunction.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/function/TicketResultHandleFunction.java index f1100000..739d4658 100644 --- a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/function/TicketResultHandleFunction.java +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/function/TicketResultHandleFunction.java @@ -15,12 +15,10 @@ */ package cn.dev33.satoken.sso.function; -import cn.dev33.satoken.sso.processor.SaSsoClientProcessor; - -import java.util.function.BiFunction; +import cn.dev33.satoken.sso.model.SaCheckTicketResult; /** - * 函数式接口:SSO-Client端:自定义校验Ticket返回值的处理逻辑 (每次从认证中心获取校验Ticket的结果后调用) + * 函数式接口:SSO-Client端:自定义校验 ticket 返回值的处理逻辑 (每次从认证中心获取校验 ticket 的结果后调用) * *

参数:loginId, back

*

返回:返回给前端的值

@@ -29,6 +27,8 @@ import java.util.function.BiFunction; * @since 1.38.0 */ @FunctionalInterface -public interface TicketResultHandleFunction extends BiFunction { +public interface TicketResultHandleFunction { + + Object run(SaCheckTicketResult ctr, String back); } \ No newline at end of file diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/model/SaCheckTicketResult.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/model/SaCheckTicketResult.java new file mode 100644 index 00000000..890d203d --- /dev/null +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/model/SaCheckTicketResult.java @@ -0,0 +1,51 @@ +/* + * Copyright 2020-2099 sa-token.cc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.dev33.satoken.sso.model; + +import cn.dev33.satoken.util.SaResult; + +/** + * 校验 ticket 返回 loginId 等结果的参数封装 + * + * @author click33 + * @since 1.38.0 + */ +public class SaCheckTicketResult { + + /** 账号id */ + public Object loginId; + + /** 此账号会话剩余有效期 */ + public long remainSessionTimeout; + + /** 从 sso-server 返回的所有参数 */ + public SaResult result; + + public SaCheckTicketResult(Object loginId, long remainSessionTimeout, SaResult result) { + this.loginId = loginId; + this.remainSessionTimeout = remainSessionTimeout; + this.result = result; + } + @Override + public String toString() { + return "CheckTicketResult{" + + "loginId=" + loginId + + ", remainSessionTimeout=" + remainSessionTimeout + + ", result=" + result + + '}'; + } + +} \ No newline at end of file diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/processor/SaSsoClientProcessor.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/processor/SaSsoClientProcessor.java index 9c8dc651..aef2e26e 100644 --- a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/processor/SaSsoClientProcessor.java +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/processor/SaSsoClientProcessor.java @@ -22,6 +22,7 @@ import cn.dev33.satoken.sso.SaSsoManager; import cn.dev33.satoken.sso.config.SaSsoClientConfig; import cn.dev33.satoken.sso.error.SaSsoErrorCode; import cn.dev33.satoken.sso.exception.SaSsoException; +import cn.dev33.satoken.sso.model.SaCheckTicketResult; import cn.dev33.satoken.sso.name.ApiName; import cn.dev33.satoken.sso.name.ParamName; import cn.dev33.satoken.sso.template.SaSsoClientTemplate; @@ -122,11 +123,11 @@ public class SaSsoClientProcessor { return res.redirect(serverAuthUrl); } else { // 1、校验ticket,获取 loginId - CheckTicketResult ctr = checkTicketByMode2Or3(ticket, apiName.ssoLogin); + SaCheckTicketResult ctr = checkTicketByMode2Or3(ticket, apiName.ssoLogin); // 2、如果开发者自定义了ticket结果值处理函数,则使用自定义的函数 if(cfg.ticketResultHandle != null) { - return cfg.ticketResultHandle.apply(ctr, back); + return cfg.ticketResultHandle.run(ctr, back); } // 3、登录并重定向至back地址 @@ -244,7 +245,7 @@ public class SaSsoClientProcessor { * @param currUri 当前路由的uri,用于计算单点注销回调地址 * @return loginId */ - public CheckTicketResult checkTicketByMode2Or3(String ticket, String currUri) { + public SaCheckTicketResult checkTicketByMode2Or3(String ticket, String currUri) { SaSsoClientConfig cfg = ssoClientTemplate.getClientConfig(); ApiName apiName = ssoClientTemplate.apiName; ParamName paramName = ssoClientTemplate.paramName; @@ -288,7 +289,7 @@ public class SaSsoClientProcessor { remainSessionTimeout = ssoClientTemplate.getStpLogic().getConfigOrGlobal().getTimeout(); } // 构建返回 - return new CheckTicketResult(loginId, remainSessionTimeout); + return new SaCheckTicketResult(loginId, remainSessionTimeout, result); } else { // 将 sso-server 回应的消息作为异常抛出 throw new SaSsoException(result.getMsg()).setCode(SaSsoErrorCode.CODE_30005); @@ -309,7 +310,7 @@ public class SaSsoClientProcessor { // 取出 Session 剩余有效期 long remainSessionTimeout = ssoClientTemplate.getStpLogic().getSessionTimeoutByLoginId(loginId); // 构建返回 - return new CheckTicketResult(loginId, remainSessionTimeout); + return new SaCheckTicketResult(loginId, remainSessionTimeout, null); } } @@ -324,20 +325,5 @@ public class SaSsoClientProcessor { } - public static class CheckTicketResult { - public Object loginId; - public long remainSessionTimeout; - public CheckTicketResult(Object loginId, long remainSessionTimeout) { - this.loginId = loginId; - this.remainSessionTimeout = remainSessionTimeout; - } - @Override - public String toString() { - return "CheckTicketResult{" + - "loginId=" + loginId + - ", remainSessionTimeout=" + remainSessionTimeout + - '}'; - } - } } diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/processor/SaSsoServerProcessor.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/processor/SaSsoServerProcessor.java index ec9e00c2..a17ff711 100644 --- a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/processor/SaSsoServerProcessor.java +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/processor/SaSsoServerProcessor.java @@ -171,6 +171,7 @@ public class SaSsoServerProcessor { // 1、获取参数 SaRequest req = SaHolder.getRequest(); + SaSsoServerConfig ssoServerConfig = ssoServerTemplate.getServerConfig(); String client = req.getParam(paramName.client); String ticket = req.getParamNotNull(paramName.ticket); String sloCallback = req.getParam(paramName.ssoLogoutCall); @@ -181,7 +182,7 @@ public class SaSsoServerProcessor { } // 3、校验签名 - if(ssoServerTemplate.getServerConfig().getIsCheckSign()) { + if(ssoServerConfig.getIsCheckSign()) { ssoServerTemplate.getSignTemplate(client).checkRequest(req, paramName.client, paramName.ticket, paramName.ssoLogoutCall); } else { @@ -199,8 +200,9 @@ public class SaSsoServerProcessor { // 6、给 client 端响应结果 long remainSessionTimeout = ssoServerTemplate.getStpLogic().getSessionTimeoutByLoginId(loginId); - return SaResult.data(loginId) - .set(paramName.remainSessionTimeout, remainSessionTimeout); + SaResult result = SaResult.data(loginId).set(paramName.remainSessionTimeout, remainSessionTimeout); + result = ssoServerConfig.checkTicketAppendData.apply(loginId, result); + return result; } /**