新增 checkTicketAppendData 策略函数,用于在校验 ticket 后,给 sso-client 端追加返回信息

This commit is contained in:
click33
2024-05-08 17:21:41 +08:00
parent e781664840
commit b23aa55ffa
7 changed files with 110 additions and 29 deletions

View File

@@ -345,7 +345,7 @@ public class SaSsoClientConfig implements Serializable {
// -------------------- 所有回调函数 -------------------- // -------------------- 所有回调函数 --------------------
/** /**
* SSO-Client端自定义校验Ticket返回值的处理逻辑 (每次从认证中心获取校验Ticket的结果后调用 * SSO-Client端自定义校验 ticket 返回值的处理逻辑 (每次从认证中心获取校验 ticket 的结果后调用)
* <p> 参数loginId, back * <p> 参数loginId, back
* <p> 返回值:返回给前端的值 * <p> 返回值:返回给前端的值
*/ */

View File

@@ -18,6 +18,7 @@ package cn.dev33.satoken.sso.config;
import cn.dev33.satoken.sso.error.SaSsoErrorCode; import cn.dev33.satoken.sso.error.SaSsoErrorCode;
import cn.dev33.satoken.sso.exception.SaSsoException; 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.DoLoginHandleFunction;
import cn.dev33.satoken.sso.function.NotLoginViewFunction; import cn.dev33.satoken.sso.function.NotLoginViewFunction;
import cn.dev33.satoken.sso.function.SendHttpFunction; import cn.dev33.satoken.sso.function.SendHttpFunction;
@@ -279,6 +280,13 @@ public class SaSsoServerConfig implements Serializable {
return SaResult.error(); return SaResult.error();
}; };
/**
* SSO-Server端在校验 ticket 后,给 sso-client 端追加返回信息的函数
*/
public CheckTicketAppendDataFunction checkTicketAppendData = (loginId, result) -> {
return result;
};
/** /**
* SSO-Server端发送Http请求的处理函数 * SSO-Server端发送Http请求的处理函数
*/ */

View File

@@ -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 端追加返回信息的函数
*
* <p> 参数loginId, SaResult 响应参数对象 </p>
* <p> 返回SaResult 响应参数对象 </p>
*
* @author click33
* @since 1.38.0
*/
@FunctionalInterface
public interface CheckTicketAppendDataFunction extends BiFunction<Object, SaResult, SaResult> {
}

View File

@@ -15,12 +15,10 @@
*/ */
package cn.dev33.satoken.sso.function; package cn.dev33.satoken.sso.function;
import cn.dev33.satoken.sso.processor.SaSsoClientProcessor; import cn.dev33.satoken.sso.model.SaCheckTicketResult;
import java.util.function.BiFunction;
/** /**
* 函数式接口SSO-Client端自定义校验Ticket返回值的处理逻辑 (每次从认证中心获取校验Ticket的结果后调用 * 函数式接口SSO-Client端自定义校验 ticket 返回值的处理逻辑 (每次从认证中心获取校验 ticket 的结果后调用)
* *
* <p> 参数loginId, back </p> * <p> 参数loginId, back </p>
* <p> 返回:返回给前端的值 </p> * <p> 返回:返回给前端的值 </p>
@@ -29,6 +27,8 @@ import java.util.function.BiFunction;
* @since 1.38.0 * @since 1.38.0
*/ */
@FunctionalInterface @FunctionalInterface
public interface TicketResultHandleFunction extends BiFunction<SaSsoClientProcessor.CheckTicketResult, String, Object> { public interface TicketResultHandleFunction {
Object run(SaCheckTicketResult ctr, String back);
} }

View File

@@ -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 +
'}';
}
}

View File

@@ -22,6 +22,7 @@ import cn.dev33.satoken.sso.SaSsoManager;
import cn.dev33.satoken.sso.config.SaSsoClientConfig; import cn.dev33.satoken.sso.config.SaSsoClientConfig;
import cn.dev33.satoken.sso.error.SaSsoErrorCode; import cn.dev33.satoken.sso.error.SaSsoErrorCode;
import cn.dev33.satoken.sso.exception.SaSsoException; 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.ApiName;
import cn.dev33.satoken.sso.name.ParamName; import cn.dev33.satoken.sso.name.ParamName;
import cn.dev33.satoken.sso.template.SaSsoClientTemplate; import cn.dev33.satoken.sso.template.SaSsoClientTemplate;
@@ -122,11 +123,11 @@ public class SaSsoClientProcessor {
return res.redirect(serverAuthUrl); return res.redirect(serverAuthUrl);
} else { } else {
// 1、校验ticket获取 loginId // 1、校验ticket获取 loginId
CheckTicketResult ctr = checkTicketByMode2Or3(ticket, apiName.ssoLogin); SaCheckTicketResult ctr = checkTicketByMode2Or3(ticket, apiName.ssoLogin);
// 2、如果开发者自定义了ticket结果值处理函数则使用自定义的函数 // 2、如果开发者自定义了ticket结果值处理函数则使用自定义的函数
if(cfg.ticketResultHandle != null) { if(cfg.ticketResultHandle != null) {
return cfg.ticketResultHandle.apply(ctr, back); return cfg.ticketResultHandle.run(ctr, back);
} }
// 3、登录并重定向至back地址 // 3、登录并重定向至back地址
@@ -244,7 +245,7 @@ public class SaSsoClientProcessor {
* @param currUri 当前路由的uri用于计算单点注销回调地址 * @param currUri 当前路由的uri用于计算单点注销回调地址
* @return loginId * @return loginId
*/ */
public CheckTicketResult checkTicketByMode2Or3(String ticket, String currUri) { public SaCheckTicketResult checkTicketByMode2Or3(String ticket, String currUri) {
SaSsoClientConfig cfg = ssoClientTemplate.getClientConfig(); SaSsoClientConfig cfg = ssoClientTemplate.getClientConfig();
ApiName apiName = ssoClientTemplate.apiName; ApiName apiName = ssoClientTemplate.apiName;
ParamName paramName = ssoClientTemplate.paramName; ParamName paramName = ssoClientTemplate.paramName;
@@ -288,7 +289,7 @@ public class SaSsoClientProcessor {
remainSessionTimeout = ssoClientTemplate.getStpLogic().getConfigOrGlobal().getTimeout(); remainSessionTimeout = ssoClientTemplate.getStpLogic().getConfigOrGlobal().getTimeout();
} }
// 构建返回 // 构建返回
return new CheckTicketResult(loginId, remainSessionTimeout); return new SaCheckTicketResult(loginId, remainSessionTimeout, result);
} else { } else {
// 将 sso-server 回应的消息作为异常抛出 // 将 sso-server 回应的消息作为异常抛出
throw new SaSsoException(result.getMsg()).setCode(SaSsoErrorCode.CODE_30005); throw new SaSsoException(result.getMsg()).setCode(SaSsoErrorCode.CODE_30005);
@@ -309,7 +310,7 @@ public class SaSsoClientProcessor {
// 取出 Session 剩余有效期 // 取出 Session 剩余有效期
long remainSessionTimeout = ssoClientTemplate.getStpLogic().getSessionTimeoutByLoginId(loginId); 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 +
'}';
}
}
} }

View File

@@ -171,6 +171,7 @@ public class SaSsoServerProcessor {
// 1、获取参数 // 1、获取参数
SaRequest req = SaHolder.getRequest(); SaRequest req = SaHolder.getRequest();
SaSsoServerConfig ssoServerConfig = ssoServerTemplate.getServerConfig();
String client = req.getParam(paramName.client); String client = req.getParam(paramName.client);
String ticket = req.getParamNotNull(paramName.ticket); String ticket = req.getParamNotNull(paramName.ticket);
String sloCallback = req.getParam(paramName.ssoLogoutCall); String sloCallback = req.getParam(paramName.ssoLogoutCall);
@@ -181,7 +182,7 @@ public class SaSsoServerProcessor {
} }
// 3、校验签名 // 3、校验签名
if(ssoServerTemplate.getServerConfig().getIsCheckSign()) { if(ssoServerConfig.getIsCheckSign()) {
ssoServerTemplate.getSignTemplate(client).checkRequest(req, ssoServerTemplate.getSignTemplate(client).checkRequest(req,
paramName.client, paramName.ticket, paramName.ssoLogoutCall); paramName.client, paramName.ticket, paramName.ssoLogoutCall);
} else { } else {
@@ -199,8 +200,9 @@ public class SaSsoServerProcessor {
// 6、给 client 端响应结果 // 6、给 client 端响应结果
long remainSessionTimeout = ssoServerTemplate.getStpLogic().getSessionTimeoutByLoginId(loginId); long remainSessionTimeout = ssoServerTemplate.getStpLogic().getSessionTimeoutByLoginId(loginId);
return SaResult.data(loginId) SaResult result = SaResult.data(loginId).set(paramName.remainSessionTimeout, remainSessionTimeout);
.set(paramName.remainSessionTimeout, remainSessionTimeout); result = ssoServerConfig.checkTicketAppendData.apply(loginId, result);
return result;
} }
/** /**