[fix][feat](chat): 添加会话中SaToken-token值传递和使用;修复“自动注入警告 => 用户未登录”

- 新增 BaseContext 类,用于保存和获取当前登录用户的 token
- 在 OpenAIServiceImpl 和 imageServiceImpl 中获取当前会话 token
- 将 token 作为参数传递给 SSEEventSourceListener
- 在 SSEEventSourceListener 中使用 token 进行用户身份验证和权限控制
- 修改 LoginHelper,增加根据 token 获取登录用户信息的方法
- 更新 InjectionMetaObjectHandler,使用 BaseContext 获取当前 token
- 修复对话时出先”自动注入警告 => 用户未登录“
This commit is contained in:
Yzm
2025-07-05 19:12:33 +08:00
parent df3b687be4
commit daa7b7315b
6 changed files with 57 additions and 4 deletions

View File

@@ -1,6 +1,7 @@
package org.ruoyi.chat.listener;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
@@ -15,6 +16,7 @@ import org.ruoyi.chat.service.chat.IChatCostService;
import org.ruoyi.common.chat.entity.chat.ChatCompletionResponse;
import org.ruoyi.common.chat.entity.chat.Message;
import org.ruoyi.common.chat.request.ChatRequest;
import org.ruoyi.common.core.service.BaseContext;
import org.ruoyi.common.core.utils.SpringUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -40,11 +42,14 @@ public class SSEEventSourceListener extends EventSourceListener {
private Long sessionId;
private String token;
@Autowired(required = false)
public SSEEventSourceListener(SseEmitter emitter,Long userId,Long sessionId) {
public SSEEventSourceListener(SseEmitter emitter,Long userId,Long sessionId, String token) {
this.emitter = emitter;
this.userId = userId;
this.sessionId = sessionId;
this.token = token;
}
@@ -80,6 +85,8 @@ public class SSEEventSourceListener extends EventSourceListener {
chatRequest.setUserId(userId);
chatRequest.setSessionId(sessionId);
chatRequest.setPrompt(stringBuffer.toString());
// 记录会话token
BaseContext.setCurrentToken(token);
chatCostService.deductToken(chatRequest);
return;
}

View File

@@ -1,5 +1,6 @@
package org.ruoyi.chat.service.chat.impl;
import cn.dev33.satoken.stp.StpUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.ruoyi.chat.config.ChatConfig;
@@ -127,8 +128,10 @@ public class ImageServiceImpl implements IChatService {
OpenAiStreamClient openAiStreamClient = ChatConfig.createOpenAiStreamClient(chatModelVo.getApiHost(), chatModelVo.getApiKey());
List<Message> messages = chatRequest.getMessages();
// 获取会话token
String token = StpUtil.getTokenValue();
// 创建 SSE 事件源监听器
SSEEventSourceListener listener = new SSEEventSourceListener(emitter, chatRequest.getUserId(), chatRequest.getSessionId());
SSEEventSourceListener listener = new SSEEventSourceListener(emitter, chatRequest.getUserId(), chatRequest.getSessionId(), token);
// 构建聊天完成请求
ChatCompletion completion = ChatCompletion

View File

@@ -1,5 +1,6 @@
package org.ruoyi.chat.service.chat.impl;
import cn.dev33.satoken.stp.StpUtil;
import io.modelcontextprotocol.client.McpSyncClient;
import lombok.extern.slf4j.Slf4j;
import org.ruoyi.chat.config.ChatConfig;
@@ -56,7 +57,8 @@ public class OpenAIServiceImpl implements IChatService {
Message userMessage = Message.builder().content("工具返回信息:"+toolString).role(Message.Role.USER).build();
messages.add(userMessage);
}
SSEEventSourceListener listener = new SSEEventSourceListener(emitter,chatRequest.getUserId(),chatRequest.getSessionId());
String token = StpUtil.getTokenValue();
SSEEventSourceListener listener = new SSEEventSourceListener(emitter,chatRequest.getUserId(),chatRequest.getSessionId(), token);
ChatCompletion completion = ChatCompletion
.builder()
.messages(messages)