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

This commit is contained in:
疯狂的狮子Li
2025-06-03 16:11:30 +08:00
parent faa9be7e4e
commit 6d7fb33ae0
4 changed files with 75 additions and 12 deletions

View File

@@ -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(() -> { remoteMessageService.publishMessage(List.of(userId), "欢迎登录RuoYi-Cloud-Plus微服务管理系统");
StpUtil.setTokenValueToStorage(loginVo.getAccessToken()); }, 5, TimeUnit.SECONDS);
remoteMessageService.publishMessage(List.of(userId), "欢迎登录RuoYi-Cloud-Plus微服务管理系统");
});
}, 3, TimeUnit.SECONDS);
return R.ok(loginVo); return R.ok(loginVo);
} }

View File

@@ -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;
}
}

View File

@@ -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 {

View File

@@ -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 = new HashMap<>();
Object attribute = saStorage.get(DATA_PERMISSION_KEY); if (SaHolder.getContext().isValid()) {
if (ObjectUtil.isNull(attribute)) { SaStorage saStorage = SaHolder.getStorage();
saStorage.set(DATA_PERMISSION_KEY, new HashMap<>());
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;