1
0
mirror of synced 2026-05-22 14:43:15 +00:00

feat(sso): 调整 SSO 示例适配最新版 & 新增 sso-resdk 示例 & 新增 sso-anon 示例

This commit is contained in:
click33
2025-05-06 23:26:49 +08:00
parent 213d98d848
commit 2ecd52b3be
62 changed files with 1090 additions and 359 deletions
@@ -81,7 +81,7 @@ public class SaSsoClientConfig implements Serializable {
public Boolean isHttp = false;
/**
* 是否打开单点注销功能 (为 true 时,接收单点注销回调消息推送)
* 是否打开单点注销功能 (为 true 时,开放 /sso/logout 接口,以及接收单点注销回调消息推送)
*/
public Boolean isSlo = true;
@@ -153,14 +153,14 @@ public class SaSsoClientConfig implements Serializable {
}
/**
* @return 是否打开单点注销功能 (为 true 时,接收单点注销回调消息推送)
* @return 是否打开单点注销功能 (为 true 时,开放 /sso/logout 接口,以及接收单点注销回调消息推送)
*/
public Boolean getIsSlo() {
return isSlo;
}
/**
* @param isSlo 是否打开单点注销功能 (为 true 时,接收单点注销回调消息推送)
* @param isSlo 是否打开单点注销功能 (为 true 时,开放 /sso/logout 接口,以及接收单点注销回调消息推送)
* @return 对象自身
*/
public SaSsoClientConfig setIsSlo(Boolean isSlo) {
@@ -82,7 +82,7 @@ public class SaSsoServerConfig implements Serializable {
/**
* 是否允许匿名 Client 接入
*/
public Boolean allowAnonClient = true;
public Boolean allowAnonClient = false;
/**
* 所有允许的授权回调地址,多个用逗号隔开 (不在此列表中的URL将禁止下放ticket) (匿名 client 使用)
@@ -0,0 +1,35 @@
/*
* 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.sso.message.SaSsoMessage;
import cn.dev33.satoken.sso.template.SaSsoTemplate;
/**
* 函数式接口:处理 SSO 消息的函数式接口
*
* <p> 参数:ssoTemplate 模板对象, 要处理的 message 消息 </p>
* <p> 返回:任意值 </p>
*
* @author click33
* @since 1.38.0
*/
@FunctionalInterface
public interface SaSsoMessageHandleFunction {
Object execute(SaSsoTemplate ssoTemplate, SaSsoMessage message);
}
@@ -27,6 +27,6 @@ import java.util.function.Function;
* @since 1.38.0
*/
@FunctionalInterface
public interface SendHttpFunction extends Function<String, String> {
public interface SendRequestFunction extends Function<String, String> {
}
@@ -18,7 +18,9 @@ package cn.dev33.satoken.sso.message;
import cn.dev33.satoken.sso.error.SaSsoErrorCode;
import cn.dev33.satoken.sso.exception.SaSsoException;
import cn.dev33.satoken.sso.function.SaSsoMessageHandleFunction;
import cn.dev33.satoken.sso.message.handle.SaSsoMessageHandle;
import cn.dev33.satoken.sso.message.handle.SaSsoMessageSimpleHandle;
import cn.dev33.satoken.sso.template.SaSsoTemplate;
import java.util.LinkedHashMap;
@@ -68,6 +70,18 @@ public class SaSsoMessageHolder {
return this;
}
/**
* 添加指定类型的简单消息处理器
*
* @param type 要处理的消息类型
* @param handle 要执行的方法
* @return 对象自身
*/
public SaSsoMessageHolder addHandle(String type, SaSsoMessageHandleFunction handle) {
messageHandleMap.put(type, new SaSsoMessageSimpleHandle(type, handle));
return this;
}
/**
* 获取指定类型的消息处理器
*
@@ -0,0 +1,67 @@
/*
* 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.message.handle;
import cn.dev33.satoken.sso.function.SaSsoMessageHandleFunction;
import cn.dev33.satoken.sso.message.SaSsoMessage;
import cn.dev33.satoken.sso.template.SaSsoTemplate;
/**
* SSO 消息处理器 - 简单实现,方便 lambda 表达式编程
*
* @author click33
* @since 1.43.0
*/
public class SaSsoMessageSimpleHandle implements SaSsoMessageHandle{
public String type;
public SaSsoMessageHandleFunction handle;
/**
* SSO 消息处理器 - 简单实现,方便 lambda 表达式编程
* @param type 要处理的消息类型
* @param handle 要执行的方法
*/
public SaSsoMessageSimpleHandle(String type, SaSsoMessageHandleFunction handle) {
this.type = type;
this.handle = handle;
}
/**
* 获取所要处理的消息类型
*
* @return /
*/
@Override
public String getHandlerType() {
return type;
}
/**
* 具体要执行的处理方法
*
* @param ssoTemplate /
* @param message /
* @return /
*/
@Override
public Object handle(SaSsoTemplate ssoTemplate, SaSsoMessage message){
return handle.execute(ssoTemplate, message);
}
}
@@ -16,8 +16,6 @@
package cn.dev33.satoken.sso.message.handle.client;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.context.model.SaRequest;
import cn.dev33.satoken.sso.message.SaSsoMessage;
import cn.dev33.satoken.sso.message.handle.SaSsoMessageHandle;
import cn.dev33.satoken.sso.name.ParamName;
@@ -56,7 +54,7 @@ public class SaSsoMessageLogoutCallHandle implements SaSsoMessageHandle {
// 1、获取对象
SaSsoClientTemplate ssoClientTemplate = (SaSsoClientTemplate) ssoTemplate;
StpLogic stpLogic = ssoClientTemplate.getStpLogic();
StpLogic stpLogic = ssoClientTemplate.getStpLogicOrGlobal();
ParamName paramName = ssoClientTemplate.paramName;
// 2、判断当前应用是否开启单点注销功能
@@ -55,7 +55,7 @@ public class SaSsoMessageCheckTicketHandle implements SaSsoMessageHandle {
// 1、获取对象
SaSsoServerTemplate ssoServerTemplate = (SaSsoServerTemplate) ssoTemplate;
ParamName paramName = ssoServerTemplate.paramName;
StpLogic stpLogic = ssoServerTemplate.getStpLogic();
StpLogic stpLogic = ssoServerTemplate.getStpLogicOrGlobal();
String client = message.getString(paramName.client);
String ticket = message.getValueNotNull(paramName.ticket).toString();
String sloCallback = message.getString(paramName.ssoLogoutCall);
@@ -65,7 +65,7 @@ public class SaSsoMessageSignoutHandle implements SaSsoMessageHandle {
String deviceId = message.getString(paramName.deviceId);
// 4、单点注销
SaLogoutParameter logoutParameter = ssoServerTemplate.getStpLogic().createSaLogoutParameter().setDeviceId(deviceId);
SaLogoutParameter logoutParameter = ssoServerTemplate.getStpLogicOrGlobal().createSaLogoutParameter().setDeviceId(deviceId);
ssoServerTemplate.ssoLogout(loginId, logoutParameter);
// 5、响应
@@ -164,7 +164,7 @@ public class SaSsoClientProcessor {
// 获取对象
SaRequest req = SaHolder.getRequest();
StpLogic stpLogic = ssoClientTemplate.getStpLogic();
StpLogic stpLogic = ssoClientTemplate.getStpLogicOrGlobal();
ParamName paramName = ssoClientTemplate.paramName;
SaSsoClientConfig ssoConfig = ssoClientTemplate.getClientConfig();
@@ -181,7 +181,7 @@ public class SaSsoClientProcessor {
}
// 注销当前应用端会话
SaLogoutParameter logoutParameter = ssoClientTemplate.getStpLogic().createSaLogoutParameter();
SaLogoutParameter logoutParameter = ssoClientTemplate.getStpLogicOrGlobal().createSaLogoutParameter();
stpLogic.logout(loginId, logoutParameter.setDeviceId(deviceId));
// 响应
@@ -199,7 +199,7 @@ public class SaSsoClientProcessor {
SaRequest req = SaHolder.getRequest();
SaResponse res = SaHolder.getResponse();
SaSsoClientConfig cfg = ssoClientTemplate.getClientConfig();
StpLogic stpLogic = ssoClientTemplate.getStpLogic();
StpLogic stpLogic = ssoClientTemplate.getStpLogicOrGlobal();
ParamName paramName = ssoClientTemplate.paramName;
// 获取参数
@@ -229,7 +229,7 @@ public class SaSsoClientProcessor {
// 获取对象
SaRequest req = SaHolder.getRequest();
SaResponse res = SaHolder.getResponse();
StpLogic stpLogic = ssoClientTemplate.getStpLogic();
StpLogic stpLogic = ssoClientTemplate.getStpLogicOrGlobal();
ParamName paramName = ssoClientTemplate.paramName;
ApiName apiName = ssoClientTemplate.apiName;
@@ -239,8 +239,6 @@ public class SaSsoClientProcessor {
// 1、校验 ticket,获取 loginId 等数据
SaCheckTicketResult ctr = checkTicket(ticket, apiName.ssoLogin);
ctr.centerId = ctr.loginId;
ctr.loginId = ssoClientTemplate.strategy.convertCenterIdToLoginId.run(ctr.centerId);
// 2、如果开发者自定义了 ticket 结果值处理函数,则使用自定义的函数
if(ssoClientTemplate.strategy.ticketResultHandle != null) {
@@ -263,7 +261,7 @@ public class SaSsoClientProcessor {
// 获取对象
SaRequest req = SaHolder.getRequest();
SaResponse res = SaHolder.getResponse();
StpLogic stpLogic = ssoClientTemplate.getStpLogic();
StpLogic stpLogic = ssoClientTemplate.getStpLogicOrGlobal();
boolean singleDeviceIdLogout = req.isParam(ssoClientTemplate.paramName.singleDeviceIdLogout, "true");
// 如果未登录,则无需注销
@@ -292,6 +290,16 @@ public class SaSsoClientProcessor {
return _ssoLogoutBack(req, res);
}
/**
* 封装:校验ticket,取出loginId,如果 ticket 无效则抛出异常 (适用于模式二或模式三)
*
* @param ticket ticket码
* @return SaCheckTicketResult
*/
public SaCheckTicketResult checkTicket(String ticket) {
return checkTicket(ticket, null);
}
/**
* 封装:校验ticket,取出loginId,如果 ticket 无效则抛出异常 (适用于模式二或模式三)
*
@@ -357,6 +365,10 @@ public class SaSsoClientProcessor {
ctr.remainSessionTimeout = result.get(paramName.remainSessionTimeout, Long.class);
ctr.result = result;
// 转换 loginId 和 centerId
ctr.centerId = ctr.loginId;
ctr.loginId = ssoClientTemplate.strategy.convertCenterIdToLoginId.run(ctr.centerId);
return ctr;
}
@@ -373,7 +385,7 @@ public class SaSsoClientProcessor {
// 可能会导致调用失败(注意是可能,而非一定,主要取决于你是否改变了数据读写格式),
// 解决方案为:在当前 sso-client 端也按照 sso-server 端的格式重写 SaSsoClientProcessor 里的方法
StpLogic stpLogic = ssoClientTemplate.getStpLogic();
StpLogic stpLogic = ssoClientTemplate.getStpLogicOrGlobal();
TicketModel ticketModel = SaSsoServerProcessor.instance.ssoServerTemplate.checkTicketParamAndDelete(ticket, ssoClientTemplate.getClient());
SaCheckTicketResult ctr = new SaCheckTicketResult();
@@ -384,6 +396,10 @@ public class SaSsoClientProcessor {
ctr.remainSessionTimeout = stpLogic.getSessionTimeoutByLoginId(ticketModel.getLoginId());
ctr.result = null;
// 转换 loginId 和 centerId
ctr.centerId = ctr.loginId;
ctr.loginId = ssoClientTemplate.strategy.convertCenterIdToLoginId.run(ctr.centerId);
return ctr;
}
@@ -101,7 +101,7 @@ public class SaSsoServerProcessor {
SaRequest req = SaHolder.getRequest();
SaResponse res = SaHolder.getResponse();
SaSsoServerConfig cfg = ssoServerTemplate.getServerConfig();
StpLogic stpLogic = ssoServerTemplate.getStpLogic();
StpLogic stpLogic = ssoServerTemplate.getStpLogicOrGlobal();
ParamName paramName = ssoServerTemplate.paramName;
// 两种情况:
@@ -177,7 +177,7 @@ public class SaSsoServerProcessor {
// 获取对象
SaRequest req = SaHolder.getRequest();
SaResponse res = SaHolder.getResponse();
StpLogic stpLogic = ssoServerTemplate.getStpLogic();
StpLogic stpLogic = ssoServerTemplate.getStpLogicOrGlobal();
Object loginId = stpLogic.getLoginIdDefaultNull();
boolean singleDeviceIdLogout = req.isParam(ssoServerTemplate.paramName.singleDeviceIdLogout, "true");
@@ -191,7 +191,7 @@ public class SaSsoServerProcessor {
}
// 完成
return SaSsoProcessorHelper.ssoLogoutBack(req, res, ssoServerTemplate.paramName);
return _ssoLogoutBack(req, res);
}
/**
@@ -228,4 +228,14 @@ public class SaSsoServerProcessor {
return ssoServerTemplate.handleMessage(message);
}
/**
* 封装:单点注销成功后返回结果
* @param req SaRequest对象
* @param res SaResponse对象
* @return 返回结果
*/
public Object _ssoLogoutBack(SaRequest req, SaResponse res) {
return SaSsoProcessorHelper.ssoLogoutBack(req, res, ssoServerTemplate.paramName);
}
}
@@ -17,7 +17,7 @@ package cn.dev33.satoken.sso.strategy;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.fun.SaParamRetFunction;
import cn.dev33.satoken.sso.function.SendHttpFunction;
import cn.dev33.satoken.sso.function.SendRequestFunction;
import cn.dev33.satoken.sso.function.TicketResultHandleFunction;
import cn.dev33.satoken.util.SaResult;
@@ -34,7 +34,7 @@ public class SaSsoClientStrategy {
/**
* 发送 Http 请求的处理函数
*/
public SendHttpFunction sendHttp = url -> {
public SendRequestFunction sendHttp = url -> {
return SaManager.getSaHttpTemplate().get(url);
};
@@ -16,11 +16,12 @@
package cn.dev33.satoken.sso.strategy;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.fun.SaFunction;
import cn.dev33.satoken.fun.SaParamFunction;
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;
import cn.dev33.satoken.sso.function.SendRequestFunction;
import cn.dev33.satoken.util.SaResult;
import java.util.Map;
@@ -36,10 +37,19 @@ public class SaSsoServerStrategy {
/**
* 发送 Http 请求的处理函数
*/
public SendHttpFunction sendHttp = url -> {
public SendRequestFunction sendRequest = url -> {
return SaManager.getSaHttpTemplate().get(url);
};
/**
* 使用异步模式执行一个任务
*/
public SaParamFunction<SaFunction> asyncRun = fun -> {
new Thread(() -> {
fun.run();
}).start();
};
/**
* 未登录时返回的 View
*/
@@ -75,7 +85,7 @@ public class SaSsoServerStrategy {
* @return 返回的结果
*/
public SaResult requestAsSaResult(String url) {
String body = sendHttp.apply(url);
String body = sendRequest.apply(url);
Map<String, Object> map = SaManager.getSaJsonTemplate().jsonToMap(body);
return new SaResult(map);
}
@@ -213,7 +213,6 @@ public class SaSsoClientTemplate extends SaSsoTemplate {
* @return 单点注销URL
*/
public SaSsoMessage buildSloMessage(Object loginId, SaLogoutParameter logoutParameter) {
SaSsoClientConfig ssoConfig = getClientConfig();
SaSsoMessage message = new SaSsoMessage();
message.setType(SaSsoConsts.MESSAGE_SIGNOUT);
message.set(paramName.client, getClient());
@@ -507,7 +507,7 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
return;
}
SaSession session = getStpLogic().getSessionByLoginId(loginId);
SaSession session = getStpLogicOrGlobal().getSessionByLoginId(loginId);
// 取出原来的
List<SaSsoClientInfo> scmList = session.get(SaSsoConsts.SSO_CLIENT_MODEL_LIST_KEY_, ArrayList::new);
@@ -522,7 +522,9 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
for (;;) {
if(scmList.size() > maxRegClient) {
SaSsoClientInfo removeScm = scmList.remove(0);
notifyClientLogout(loginId, null, removeScm, true, true);
strategy.asyncRun.run(() -> {
notifyClientLogout(loginId, null, removeScm, true, true);
});
} else {
break;
}
@@ -562,7 +564,7 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
* @param loginId 指定账号
*/
public void ssoLogout(Object loginId) {
ssoLogout(loginId, getStpLogic().createSaLogoutParameter());
ssoLogout(loginId, getStpLogicOrGlobal().createSaLogoutParameter());
}
/**
@@ -577,32 +579,37 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
pushToAllClientByLogoutCall(loginId, logoutParameter);
// 2、SaSession 挂载的 Client 端注销会话
SaSession session = getStpLogic().getSessionByLoginId(loginId, false);
SaSession session = getStpLogicOrGlobal().getSessionByLoginId(loginId, false);
if(session == null) {
return;
}
List<SaSsoClientInfo> scmList = session.get(SaSsoConsts.SSO_CLIENT_MODEL_LIST_KEY_, ArrayList::new);
scmList.forEach(scm -> {
notifyClientLogout(loginId, logoutParameter.getDeviceId(), scm, false, false);
strategy.asyncRun.run(() -> {
notifyClientLogout(loginId, logoutParameter.getDeviceId(), scm, false, false);
});
});
// 3、Server 端本身注销
getStpLogic().logout(loginId, logoutParameter);
getStpLogicOrGlobal().logout(loginId, logoutParameter);
}
/**
* 通知指定账号的指定客户端注销
*
* @param loginId 指定账号
* @param deviceId 指定设备 id
* @param scm 客户端信息对象
* @param autoLogout 是否为超过 maxRegClient 的自动注销
* @param isPushWork 如果该 client 没有注册注销回调地址,是否使用 push 消息的方式进行注销回调通知
*
* @return /
*/
public void notifyClientLogout(Object loginId, String deviceId, SaSsoClientInfo scm, boolean autoLogout, boolean isPushWork) {
public String notifyClientLogout(Object loginId, String deviceId, SaSsoClientInfo scm, boolean autoLogout, boolean isPushWork) {
// 如果给个null值,不进行任何操作
if(scm == null || scm.mode != SaSsoConsts.SSO_MODE_3) {
return;
return null;
}
// 如果此 Client 并没有注册 单点注销 回调地址
@@ -610,9 +617,10 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
if(SaFoxUtil.isEmpty(sloCallUrl)) {
// TODO 代码有效性待验证
if(isPushWork && SaFoxUtil.isNotEmpty(scm.getClient())) {
pushToClientByLogoutCall(getClient(scm.getClient()), loginId, getStpLogic().createSaLogoutParameter());
SaSsoClientModel client = getClient(scm.getClient());
return pushToClientByLogoutCall(client, loginId, getStpLogicOrGlobal().createSaLogoutParameter());
}
return;
return null;
}
// 参数
@@ -627,7 +635,7 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
String finalUrl = SaFoxUtil.joinParam(sloCallUrl, signParamsStr);
// 发起请求
strategy.sendHttp.apply(finalUrl);
return strategy.sendRequest.apply(finalUrl);
}
@@ -644,7 +652,7 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
String noticeUrl = clientModel.splicingPushUrl();
String paramsStr = getSignTemplate(clientModel.getClient()).addSignParamsAndJoin(message);
String finalUrl = SaFoxUtil.joinParam(noticeUrl, paramsStr);
return strategy.sendHttp.apply(finalUrl);
return strategy.sendRequest.apply(finalUrl);
}
/**
@@ -691,7 +699,7 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
public void pushToAllClient(SaSsoMessage message) {
List<SaSsoClientModel> needPushClients = getNeedPushClients();
for (SaSsoClientModel client : needPushClients) {
pushMessage(client, message);
strategy.asyncRun.run(() -> pushMessage(client, message));
}
}
@@ -705,7 +713,9 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
List<SaSsoClientModel> npClients = getNeedPushClients();
for (SaSsoClientModel client : npClients) {
if(client.getIsSlo()) {
pushToClientByLogoutCall(client, loginId, logoutParameter);
strategy.asyncRun.run(() -> {
pushToClientByLogoutCall(client, loginId, logoutParameter);
});
}
}
}
@@ -715,13 +725,14 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
*
* @param loginId /
* @param logoutParameter 注销参数
* @return /
*/
public void pushToClientByLogoutCall(SaSsoClientModel client, Object loginId, SaLogoutParameter logoutParameter) {
public String pushToClientByLogoutCall(SaSsoClientModel client, Object loginId, SaLogoutParameter logoutParameter) {
SaSsoMessage message = new SaSsoMessage();
message.setType(SaSsoConsts.MESSAGE_LOGOUT_CALL);
message.set(paramName.loginId, loginId);
message.set(paramName.deviceId, logoutParameter.getDeviceId());
pushMessage(client, message);
return pushMessage(client, message);
}
@@ -766,7 +777,7 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
* @return key
*/
public String splicingTicketModelSaveKey(String ticket) {
return getStpLogic().getConfigOrGlobal().getTokenName() + ":ticket:" + ticket;
return getStpLogicOrGlobal().getConfigOrGlobal().getTokenName() + ":ticket:" + ticket;
}
/**
@@ -780,7 +791,7 @@ public class SaSsoServerTemplate extends SaSsoTemplate {
if(SaFoxUtil.isEmpty(client) || SaSsoConsts.CLIENT_WILDCARD.equals(client)) {
client = SaSsoConsts.CLIENT_ANON;
}
return getStpLogic().getConfigOrGlobal().getTokenName() + ":ticket-index:" + client + ":" + id;
return getStpLogicOrGlobal().getConfigOrGlobal().getTokenName() + ":ticket-index:" + client + ":" + id;
}
}
@@ -61,11 +61,39 @@ public class SaSsoTemplate {
}
/**
* 获取底层使用的会话对象
* 底层使用的 StpLogic 对象
*/
StpLogic stpLogic;
/**
* 写入底层使用的会话对象
*
* @param stpLogic /
* @return /
*/
public SaSsoTemplate setStpLogic(StpLogic stpLogic) {
this.stpLogic = stpLogic;
return this;
}
/**
* 获取底层使用的会话对象
* @return /
*/
public StpLogic getStpLogic() {
return StpUtil.stpLogic;
return this.stpLogic;
}
/**
* 获取底层使用的会话对象,如果没有配置则返回全局默认 StpLogic
* @return /
*/
public StpLogic getStpLogicOrGlobal() {
StpLogic stpLogic = getStpLogic();
if (stpLogic == null) {
return StpUtil.stpLogic;
}
return stpLogic;
}
// ----------- 消息处理