diff --git a/sa-token-doc/sso/sso-dev.md b/sa-token-doc/sso/sso-dev.md index d3368bf7..3f9eaf07 100644 --- a/sa-token-doc/sso/sso-dev.md +++ b/sa-token-doc/sso/sso-dev.md @@ -79,7 +79,7 @@ SaSsoServerUtil.checkRedirectUrl(String client, String url); SaSsoServerUtil.ssoLogout(Object loginId); // 指定账号单点注销 -SaSsoServerUtil.ssoLogout(Object loginId, SaLogoutParameter logoutParameter); +SaSsoServerUtil.ssoLogout(Object loginId, SaLogoutParameter logoutParameter, String ignoreClient); ``` diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/message/handle/server/SaSsoMessageSignoutHandle.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/message/handle/server/SaSsoMessageSignoutHandle.java index ad7a8d20..1b8c62ab 100644 --- a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/message/handle/server/SaSsoMessageSignoutHandle.java +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/message/handle/server/SaSsoMessageSignoutHandle.java @@ -61,12 +61,13 @@ public class SaSsoMessageSignoutHandle implements SaSsoMessageHandle { } // 3、获取参数 + String client = message.getString(paramName.client); Object loginId = message.get(paramName.loginId); String deviceId = message.getString(paramName.deviceId); // 4、单点注销 SaLogoutParameter logoutParameter = ssoServerTemplate.getStpLogicOrGlobal().createSaLogoutParameter().setDeviceId(deviceId); - ssoServerTemplate.ssoLogout(loginId, logoutParameter); + ssoServerTemplate.ssoLogout(loginId, logoutParameter, client); // 5、响应 return SaResult.ok(); 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 083d5926..769a6a28 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 @@ -187,7 +187,7 @@ public class SaSsoServerProcessor { if(singleDeviceIdLogout) { logoutParameter.setDeviceId(stpLogic.getLoginDeviceId()); } - ssoServerTemplate.ssoLogout(loginId, logoutParameter); + ssoServerTemplate.ssoLogout(loginId, logoutParameter, null); } // 完成 diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/template/SaSsoServerTemplate.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/template/SaSsoServerTemplate.java index 0d91bee4..cf5693c1 100644 --- a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/template/SaSsoServerTemplate.java +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/template/SaSsoServerTemplate.java @@ -573,7 +573,7 @@ public class SaSsoServerTemplate extends SaSsoTemplate { * @param loginId 指定账号 */ public void ssoLogout(Object loginId) { - ssoLogout(loginId, getStpLogicOrGlobal().createSaLogoutParameter()); + ssoLogout(loginId, getStpLogicOrGlobal().createSaLogoutParameter(), null); } /** @@ -581,11 +581,12 @@ public class SaSsoServerTemplate extends SaSsoTemplate { * * @param loginId 指定账号 * @param logoutParameter 注销参数 + * @param ignoreClient 要被忽略掉的 client,填 null 代表不忽略 */ - public void ssoLogout(Object loginId, SaLogoutParameter logoutParameter) { + public void ssoLogout(Object loginId, SaLogoutParameter logoutParameter, String ignoreClient) { // 1、消息推送:单点注销 - pushToAllClientByLogoutCall(loginId, logoutParameter); + pushToAllClientByLogoutCall(loginId, logoutParameter, ignoreClient); // 2、SaSession 挂载的 Client 端注销会话 SaSession session = getStpLogicOrGlobal().getSessionByLoginId(loginId, false); @@ -717,7 +718,7 @@ public class SaSsoServerTemplate extends SaSsoTemplate { public void pushToAllClient(SaSsoMessage message, String ignoreClient) { List needPushClients = getNeedPushClients(); for (SaSsoClientModel client : needPushClients) { - if(ignoreClient != null && ignoreClient.equals(client.getClient())) { + if(SaFoxUtil.isNotEmpty(ignoreClient) && ignoreClient.equals(client.getClient())) { continue; } strategy.asyncRun.run(() -> pushMessage(client, message)); @@ -729,10 +730,14 @@ public class SaSsoServerTemplate extends SaSsoTemplate { * * @param loginId / * @param logoutParameter 注销参数 + * @param ignoreClient 要被忽略掉的 client,填 null 代表不忽略 */ - public void pushToAllClientByLogoutCall(Object loginId, SaLogoutParameter logoutParameter) { + public void pushToAllClientByLogoutCall(Object loginId, SaLogoutParameter logoutParameter, String ignoreClient) { List npClients = getNeedPushClients(); for (SaSsoClientModel client : npClients) { + if(SaFoxUtil.isNotEmpty(ignoreClient) && ignoreClient.equals(client.getClient())) { + continue; + } if(client.getIsSlo()) { strategy.asyncRun.run(() -> { pushToClientByLogoutCall(client, loginId, false, logoutParameter); diff --git a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/template/SaSsoServerUtil.java b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/template/SaSsoServerUtil.java index bc9cb86a..469354c5 100644 --- a/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/template/SaSsoServerUtil.java +++ b/sa-token-plugin/sa-token-sso/src/main/java/cn/dev33/satoken/sso/template/SaSsoServerUtil.java @@ -238,9 +238,10 @@ public class SaSsoServerUtil { * * @param loginId 指定账号 * @param logoutParameter 注销参数 + * @param ignoreClient 要被忽略掉的 client,填 null 代表不忽略 */ - public static void ssoLogout(Object loginId, SaLogoutParameter logoutParameter) { - SaSsoServerProcessor.instance.ssoServerTemplate.ssoLogout(loginId, logoutParameter); + public static void ssoLogout(Object loginId, SaLogoutParameter logoutParameter, String ignoreClient) { + SaSsoServerProcessor.instance.ssoServerTemplate.ssoLogout(loginId, logoutParameter, ignoreClient); }