feat(sso): 调整 SSO 示例适配最新版 & 新增 sso-resdk 示例 & 新增 sso-anon 示例
This commit is contained in:
+3
-3
@@ -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) {
|
||||
|
||||
+1
-1
@@ -82,7 +82,7 @@ public class SaSsoServerConfig implements Serializable {
|
||||
/**
|
||||
* 是否允许匿名 Client 接入
|
||||
*/
|
||||
public Boolean allowAnonClient = true;
|
||||
public Boolean allowAnonClient = false;
|
||||
|
||||
/**
|
||||
* 所有允许的授权回调地址,多个用逗号隔开 (不在此列表中的URL将禁止下放ticket) (匿名 client 使用)
|
||||
|
||||
+35
@@ -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);
|
||||
|
||||
}
|
||||
+1
-1
@@ -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> {
|
||||
|
||||
}
|
||||
+14
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指定类型的消息处理器
|
||||
*
|
||||
|
||||
+67
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+1
-3
@@ -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、判断当前应用是否开启单点注销功能
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+1
-1
@@ -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、响应
|
||||
|
||||
+24
-8
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+13
-3
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+2
-2
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
+13
-3
@@ -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);
|
||||
}
|
||||
|
||||
-1
@@ -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());
|
||||
|
||||
+29
-18
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+30
-2
@@ -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;
|
||||
}
|
||||
|
||||
// ----------- 消息处理
|
||||
|
||||
Reference in New Issue
Block a user