Przeglądaj źródła

fix 修复 优化dubbo调用跟satoken无关的场景会报错无上下文问题

疯狂的狮子Li 1 rok temu
rodzic
commit
6d7fb33ae0

+ 2 - 7
ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java

@@ -1,8 +1,6 @@
 package org.dromara.auth.controller;
 package org.dromara.auth.controller;
 
 
-import cn.dev33.satoken.context.mock.SaTokenContextMockUtil;
 import cn.dev33.satoken.exception.NotLoginException;
 import cn.dev33.satoken.exception.NotLoginException;
-import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.codec.Base64;
 import cn.hutool.core.codec.Base64;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -104,11 +102,8 @@ public class TokenController {
 
 
         Long userId = LoginHelper.getUserId();
         Long userId = LoginHelper.getUserId();
         scheduledExecutorService.schedule(() -> {
         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);
         return R.ok(loginVo);
     }
     }
 
 

+ 65 - 0
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;
+	}
+
+}

+ 1 - 1
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
     @Override
     public Result invoke(Invoker<?> invoker, Invocation invocation) {
     public Result invoke(Invoker<?> invoker, Invocation invocation) {
-        if(SaHolder.getContext().isValid()) {
+        if (SaHolder.getContext().isValid()) {
             return invoker.invoke(invocation);
             return invoker.invoke(invocation);
         } else {
         } else {
             try {
             try {

+ 7 - 4
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
      * @throws NullPointerException 如果数据权限上下文类型异常,则抛出NullPointerException
      */
      */
     public static Map<String, Object> getContext() {
     public static Map<String, Object> 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);
             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) {
         if (attribute instanceof Map map) {
             return map;
             return map;