From 6d7fb33ae0ec1f7480cce0ec6468cb3517e8617e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Tue, 3 Jun 2025 16:11:30 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E4=BC=98=E5=8C=96du?= =?UTF-8?q?bbo=E8=B0=83=E7=94=A8=E8=B7=9Fsatoken=E6=97=A0=E5=85=B3?= =?UTF-8?q?=E7=9A=84=E5=9C=BA=E6=99=AF=E4=BC=9A=E6=8A=A5=E9=94=99=E6=97=A0?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/controller/TokenController.java | 9 +-- .../filter/SaTokenDubbo3ConsumerFilter.java | 65 +++++++++++++++++++ .../filter/SaTokenDubbo3ContextFilter.java | 2 +- .../mybatis/helper/DataPermissionHelper.java | 11 ++-- 4 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-dubbo/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ConsumerFilter.java diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java index e337dcfe..416f7a49 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java @@ -1,8 +1,6 @@ package org.dromara.auth.controller; -import cn.dev33.satoken.context.mock.SaTokenContextMockUtil; import cn.dev33.satoken.exception.NotLoginException; -import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; @@ -104,11 +102,8 @@ public class TokenController { Long userId = LoginHelper.getUserId(); scheduledExecutorService.schedule(() -> { - SaTokenContextMockUtil.setMockContext(() -> { - StpUtil.setTokenValueToStorage(loginVo.getAccessToken()); - remoteMessageService.publishMessage(List.of(userId), "欢迎登录RuoYi-Cloud-Plus微服务管理系统"); - }); - }, 3, TimeUnit.SECONDS); + remoteMessageService.publishMessage(List.of(userId), "欢迎登录RuoYi-Cloud-Plus微服务管理系统"); + }, 5, TimeUnit.SECONDS); return R.ok(loginVo); } diff --git a/ruoyi-common/ruoyi-common-dubbo/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ConsumerFilter.java b/ruoyi-common/ruoyi-common-dubbo/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ConsumerFilter.java new file mode 100644 index 00000000..6257217c --- /dev/null +++ b/ruoyi-common/ruoyi-common-dubbo/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ConsumerFilter.java @@ -0,0 +1,65 @@ +/* + * 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.context.dubbo3.filter; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.context.SaHolder; +import cn.dev33.satoken.context.SaTokenContextDefaultImpl; +import cn.dev33.satoken.same.SaSameUtil; +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.util.SaTokenConsts; +import org.apache.dubbo.common.constants.CommonConstants; +import org.apache.dubbo.common.extension.Activate; +import org.apache.dubbo.rpc.*; + +/** + * Sa-Token 整合 Dubbo3 Consumer 端(调用端)过滤器 + * + * @author click33 + * @since 1.34.0 + */ +@Activate(group = {CommonConstants.CONSUMER}, order = SaTokenConsts.RPC_PERMISSION_FILTER_ORDER) +public class SaTokenDubbo3ConsumerFilter implements Filter { + + @Override + public Result invoke(Invoker invoker, Invocation invocation) { + + // 追加 Same-Token 参数 + if(SaManager.getConfig().getCheckSameToken()) { + RpcContext.getServiceContext().setAttachment(SaSameUtil.SAME_TOKEN,SaSameUtil.getToken()); + } + + // 无上下文直接跳过下面流程 + if (!SaHolder.getContext().isValid()) { + return invoker.invoke(invocation); + } + + // 1. 调用前,向下传递会话Token + if(SaManager.getSaTokenContext() != SaTokenContextDefaultImpl.defaultContext) { + RpcContext.getServiceContext().setAttachment(SaTokenConsts.JUST_CREATED, StpUtil.getTokenValueNotCut()); + } + + // 2. 开始调用 + Result invoke = invoker.invoke(invocation); + + // 3. 调用后,解析回传的Token值 + StpUtil.setTokenValue(invoke.getAttachment(SaTokenConsts.JUST_CREATED_NOT_PREFIX)); + + // note + return invoke; + } + +} diff --git a/ruoyi-common/ruoyi-common-dubbo/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ContextFilter.java b/ruoyi-common/ruoyi-common-dubbo/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ContextFilter.java index 3f81b600..341019ca 100644 --- a/ruoyi-common/ruoyi-common-dubbo/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ContextFilter.java +++ b/ruoyi-common/ruoyi-common-dubbo/src/main/java/cn/dev33/satoken/context/dubbo3/filter/SaTokenDubbo3ContextFilter.java @@ -34,7 +34,7 @@ public class SaTokenDubbo3ContextFilter implements Filter { @Override public Result invoke(Invoker invoker, Invocation invocation) { - if(SaHolder.getContext().isValid()) { + if (SaHolder.getContext().isValid()) { return invoker.invoke(invocation); } else { try { diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java index 951f3dfe..ffb864cf 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java @@ -87,11 +87,14 @@ public class DataPermissionHelper { * @throws NullPointerException 如果数据权限上下文类型异常,则抛出NullPointerException */ public static Map getContext() { - SaStorage saStorage = SaHolder.getStorage(); - Object attribute = saStorage.get(DATA_PERMISSION_KEY); - if (ObjectUtil.isNull(attribute)) { - saStorage.set(DATA_PERMISSION_KEY, new HashMap<>()); + Object attribute = new HashMap<>(); + if (SaHolder.getContext().isValid()) { + SaStorage saStorage = SaHolder.getStorage(); attribute = saStorage.get(DATA_PERMISSION_KEY); + if (ObjectUtil.isNull(attribute)) { + saStorage.set(DATA_PERMISSION_KEY, new HashMap<>()); + attribute = saStorage.get(DATA_PERMISSION_KEY); + } } if (attribute instanceof Map map) { return map;