大模型研发 - 42 MCP:采用OAuth2保护Spring AI MCP服务器

news/2025/11/24 13:59:03/文章来源:https://www.cnblogs.com/yangykaifa/p/19263921

文章目录

  • Pre
  • 1. 简介
  • 2. 依赖项
  • 3. 创建MCP服务器
  • 4. 添加安全配置
  • 5. 测试安全的MCP服务器
  • 6. 总结

在这里插入图片描述

Pre

大模型开发 - 01 Spring AI 核心特性一览

大模型开发 - 02 Spring AI Concepts

大模型开发 - 03 QuickStart_借助DeepSeekChatModel实现Spring AI 集成 DeepSeek

大模型开发 - 04 QuickStart_DeepSeek 模型调用流程源码解析:从 Prompt 到远程请求

大模型开发 - 05 QuickStart_接入阿里百炼平台:Spring AI Alibaba 与 DashScope SDK

大模型开发 - 06 QuickStart_本地大模型私有化部署实战:Ollama + Spring AI 全栈指南

大模型开发 - 07 ChatClient:构建统一、优雅的大模型交互接口

大模型开发 - 07 ChatClient:Spring AI ChatClient 的流式响应实践(02)

大模型开发 - 08 ChatClient:构建智能对话应用的流畅 API

大模型开发 - 09 ChatClient:基于 Spring AI 的多平台多模型动态切换实战

大模型开发 - 10 ChatClient:Advisors API 构建可插拔、可组合的智能对话增强体系

大模型开发 - 11 ChatClient:Advisor 机制详解:拦截、增强与自定义 AI 对话流程

大模型开发 - 12 Prompt:Spring AI 中的提示(Prompt)系统详解_从基础概念到高级工程实践

大模型开发 - 13 Prompt:提示词工程实战指南_Spring AI 中的提示设计、模板化与最佳实践

大模型开发 - 14 Chat Memory:实现跨轮次对话上下文管理

大模型开发 - 15 Tool Calling :从入门到实战,一步步构建智能Agent系统

大模型开发 - 16 Chat Memory:借助 ChatMemory + PromptChatMemoryAdvisor轻松实现大模型多轮对话记忆

大模型开发 - 17 Structured Output Converter:结构化输出转换器_从文本到结构化数据的可靠桥梁

大模型开发 - 18 Chat Memory:集成 JdbcChatMemoryRepository 实现大模型多轮对话记忆

大模型开发 - 19 Chat Memory:集成 BaseRedisChatMemoryRepository实现大模型多轮对话记忆

大模型开发 - 20 Chat Memory:多层次记忆架构_突破大模型对话中的 Token 上限瓶颈

大模型开发 - 21 Structured Output Converter:结构化输出功能实战指南

大模型开发 - 22 Multimodality API:多模态大模型与 Spring AI 的融合

大模型开发 - 23 Chat Model API:深入解析 Spring AI Chat Model API_构建统一、灵活、可扩展的 AI 对话系统

大模型开发 - 24 Embeddings Model API:深入解析 Spring AI Embeddings Model API_构建语义理解的基石

大模型开发 - 25 Image Model API:深入解析 Spring AI Image Model API_构建统一、灵活的 AI 图像生成系统

大模型开发 - 26 Origin Tools: Spring AI 结构化多聊天客户端实战

大模型开发 - 27 Tool Calling:Spring AI 中的工具调用指南

大模型开发 - 28 Tool Calling:Spring AI 工具调用执行外部操作实战

大模型开发 - 29 Tool Calling:大模型与业务系统集成的利器 _Tool Calling 实战指南

大模型开发 - 30 Tool Calling:Spring AI Tool Calling 工作原理及源码详解

大模型开发 - 31 Tool Calling:解决大模型“工具选择困难症”_基于 RAG 的动态工具加载方案解读

大模型开发 - 32 Tool Calling:Spring AI 工具调用最佳实践完整指南

大模型开发 - 33 MCP:深入理解 Model Context Protocol(MCP)及其在 Spring AI 中的实践指南

大模型开发 - 34 MCP:Spring AI MCP 客户端启动器(MCP Client Boot Starter)深度指南

大模型开发 - 35 MCP:Spring AI MCP 服务端启动器(MCP Server Boot Starter)完全指南

大模型开发 - 36 MCP:深入理解 MCP Utilities :同步与异步工具回调

大模型开发 - 37 RAG:Retrieval Augmented Generation(RAG)详解与实战指南

大模型开发 - 38 AGENT:Effective AI Agents 5种智能体开发模式深入解读

大模型开发 - 39 AGENT: Building effective agents

大模型开发 - 40 MCP:基于Spring AI和OAuth2的MCP授权全流程实战

大模型开发 - 41 审核模型:Spring AI 集成 OpenAI Moderation审核模型指南


1. 简介

MCP(模型上下文协议,Model Context Protocol)是Anthropic提出的一个开放标准,旨在让AI模型以结构化方式与外部工具、数据源和服务进行交互。MCP服务器是一种轻量级后端应用,它通过MCP接口暴露特定能力,比如访问文件、查询数据库或调用API。

为了让MCP服务器达到生产级,我们通常考虑将它们拆分为独立应用,这样可以方便规模扩展和独立维护。但由于这些服务器可能会处理敏感任务,我们需要保护其接口,只允许可信客户端进行访问。

这时就需要用到OAuth2。OAuth2是一种广为人知的API安全令牌授权协议。MCP服务器不会直接管理用户凭据,而是信任由中央授权服务器签发的验证令牌。我们可以利用OAuth2根据作用域和角色来授权或限制客户端访问MCP的特定能力。

接下来我们将介绍如何在Spring AI应用中使用OAuth2保护MCP服务器。

2. 依赖项

首先,添加Spring AI MCP服务器依赖,用于获取HTTP和SSE传输及MCP核心支持:

<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId>
</dependency>

然后添加OAuth授权服务器依赖,它负责签发OAuth2访问令牌:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
<version>3.3.3</version>
</dependency>

最后,添加Spring Security的resource-server依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
<version>3.4.2</version>
</dependency>

通过这个依赖,可以确保MCP端点会拒绝无效或缺失的Bearer令牌。

3. 创建MCP服务器

接下来实现一个简单MCP服务器,服务中包含一个工具,能返回指定股票代码的价格。

定义一个StockInformationHolder类:

public class StockInformationHolder {
@Tool(description = "Get stock price for a company symbol")
public String getStockPrice(@ToolParam String symbol) {
if ("AAPL".equalsIgnoreCase(symbol)) {
return "AAPL: $150.00";
} else if ("GOOGL".equalsIgnoreCase(symbol)) {
return "GOOGL: $2800.00";
} else {
return symbol + ": Data not available";
}
}
}

getStockPrice()方法根据输入股票代码返回对应股票价格,对未知代码返回默认信息。方法用@Tool注解标记,将被用于工具定义。同时,symbol参数用@ToolParam注解,确保在工具构建过程中能被正确处理。

创建McpServerConfiguration类,注册工具:

@Configuration
public class McpServerConfiguration {
@Bean
public ToolCallbackProvider stockTools() {
return MethodToolCallbackProvider.builder()
.toolObjects(new StockInformationHolder())
.build();
}
}

这里定义了ToolCallbackProvider Bean,并绑定了StockInformationHolder类。至此已经拥有可用的MCP服务器,可通过GET /sse端点开启SSE连接。

如需向MCP服务器发送消息,可通过POST /mcp/message端点,并提交如下JSON内容:

{
"jsonrpc": "2.0",
"id": "1",
"method": "tools/call",
"params": {
"name": "getStockPrice",
"arguments": {
"arg0": "AAPL"
}
}
}

method字段为"tools/call",代表调用工具功能。params对象指定方法参数,包括工具名(默认为注解方法名)以及参数map。

4. 添加安全配置

接下来需要保护MCP服务器。

首先在application.yml中配置授权服务器:

spring:
security:
oauth2:
authorizationserver:
client:
oidc-client:
registration:
client-id: mcp-client
client-secret: "{noop}secret"
client-authentication-methods: client_secret_basic
authorization-grant-types: client_credentials

定义了令牌申请客户端的唯一标识。client-secret用{noop}secret,仅用于演示场景,{noop}表示不对secret进行加密,便于测试。

然后创建安全配置类McpServerSecurityConfiguration:

@Configuration
@EnableWebSecurity
public class McpServerSecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/mcp/**").authenticated()
.requestMatchers("/sse").authenticated()
.anyRequest().permitAll())
.with(OAuth2AuthorizationServerConfigurer.authorizationServer(), Customizer.withDefaults())
.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()))
.csrf(CsrfConfigurer::disable)
.cors(Customizer.withDefaults())
.build();
}
}

这里限制了对/mcp和/sse端点的所有请求都必须认证,其他端点则开放。

我们用authorizationServer()和oauth2ResourceServer()方法进行配置,代表该应用既暴露令牌端点,又作为资源服务器通过JWT令牌验证请求。

5. 测试安全的MCP服务器

下面进行测试。创建McpServerOAuth2LiveTest测试类:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class McpServerOAuth2LiveTest {
private static final Logger log = LoggerFactory.getLogger(McpServerOAuth2LiveTest.class);
@LocalServerPort
private int port;
private WebClient webClient;
@BeforeEach
void setup() {
webClient = WebClient.create("http://localhost:" + port);
}
}

随机端口启动应用,并初始化WebClient。

调用/sse端点打开SSE连接:

Flux eventStream = webClient.get()
.uri("/sse")
.header("Authorization", obtainAccessToken())
.accept(MediaType.TEXT_EVENT_STREAM)
.retrieve()
.bodyToFlux(String.class);
eventStream.subscribe(
data -> {
log.info("Response received: {}", data);
if (!isRequestMessage(data)) {
assertThat(data).containsSequence("AAPL", "$150");
}
},
error -> log.error("Stream error: {}", error.getMessage()),
() -> log.info("Stream completed")
);

断言响应消息中包含预期股票信息。

向/mcp/message端点发送请求:

Flux sendMessage = webClient.post()
.uri("/mcp/message")
.header("Authorization", obtainAccessToken())
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.TEXT_EVENT_STREAM)
.bodyValue("""
{
"jsonrpc": "2.0",
"id": "1",
"method": "tools/call",
"params": {
"name": "getStockPrice",
"arguments": {
"arg0": "AAPL"
}
}
}
""")
.retrieve()
.bodyToFlux(String.class);

请求授权头均包含。

获取访问令牌的方法如下:

public String obtainAccessToken() {
String clientId = "mcp-client";
String clientSecret = "secret";
String basicToken = Base64.getEncoder()
.encodeToString((clientId + ":" + clientSecret).getBytes(StandardCharsets.UTF_8));
return "Bearer " + webClient.post()
.uri("/oauth2/token")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE)
.header(HttpHeaders.AUTHORIZATION, "Basic " + basicToken)
.body(BodyInserters.fromFormData("grant_type", "client_credentials"))
.retrieve()
.bodyToMono(JsonNode.class)
.map(node -> node.get("access_token").asText())
.block(Duration.ofSeconds(5));
}

测试后可看到安全过滤器正常工作,响应数据成功返回。


6. 总结

我们通过Spring AI集成OAuth2,为MCP服务器关键端点提供了安全保护。这套方案高度灵活,可扩展为基于角色和作用域的控制,实现对某些工具或操作的权限隔离。

生产环境下可以集成更成熟的身份提供者,比如Keycloak或者Okta,也可以通过扩展令牌声明内容,用于细粒度工具权限管控

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/974811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白发转黑专利技术加盟品牌排行榜:谁主沉浮?

开篇引言:白发转黑市场,专利技术成新宠 在当下这个追求年轻与美丽的时代,白发成了许多人的心头之痛。无论是遗传、压力还是岁月留下的痕迹,白发总让人显得沧桑。于是,“白发转黑”市场应运而生,成为美容养生领域…

2025 年 11 月智能悬浮门厂家权威推荐榜:铝合金折叠门、别墅段滑门、铝艺折叠门、高铁站悬浮门、码头折叠门、机场折叠门、工业园折叠门、展览馆悬浮门、体育馆折叠门,高端定制与安全耐用之选

2025 年 11 月智能悬浮门厂家权威推荐榜:铝合金折叠门、别墅段滑门、铝艺折叠门、高铁站悬浮门、码头折叠门、机场折叠门、工业园折叠门、展览馆悬浮门、体育馆折叠门,高端定制与安全耐用之选 随着城市化进程加速和建…

jmeter 接口请求时,请求post与响应报文中 中文字符乱码问题 - BKY007

一、修改 jmeter.properties 文件中的 参数项配置 1)csvdataset.file.encoding_list=UTF-8|UTF-16|ISO-8859-15|US-ASCII|ANSI|GBK 2)sampleresult.default.encoding=UTF-8二、 检查 后缀为 .CSV的 文件 编码 是否为…

推荐一款OOK调制遥控器芯片-DP4335A

DP4335 是一款低功耗、高性能、大功率、支持 315MHz/433MHz 短距离无线通讯的发射器, 支持 OOK 调制方式。DP4335 片内集成了 PLL 和功率放大器,功率放大器采用 E 类放大器结构, 将 PLL 输出的信号进行放大后输出到…

让老版 IntelliJ IDEA 2020.1.4 支持 JDK 17 启动 springboot3 项目

让老版 IntelliJ IDEA 2020.1.4 支持 JDK 17 启动 springboot3 项目IntelliJ IDEA 2020.1.4 是比较老的版本,不支持 JDK 17,特别是启动项目时会报错: Error:Cannot determine path to tools.jar library for 17 (D:…

2025年国产翻译耳机制造厂权威推荐:蓝牙翻译耳机/智能翻译耳机/同传翻译手表源头厂家精选

在全球跨语言交流日益频繁的今天,一副智能翻译耳机正成为打破沟通壁垒、提升商务效率的关键工具。 随着人工智能技术的快速发展和全球化商务需求的增长,智能翻译设备市场正迎来爆发式增长。国产翻译耳机凭借其卓越的…

2025年11月防火涂料/钢结构防火涂料/非膨胀型防火涂料/膨胀型防火涂料/特种防火涂料源头生产厂家权威评测与选购指南

摘要 2025年特种防火涂料行业迎来技术升级新阶段,随着国家对建筑消防安全要求的不断提高,特种防火涂料市场需求持续增长。本文基于行业数据和技术参数,对当前市场上主流特种防火涂料品牌进行综合评测,为工程单位、…

2025年11月防火/钢结构/非膨胀型/膨胀型/特种防火涂料生产厂家TOP10综合评测与选购指南:权威推荐榜单揭晓

摘要 随着建筑安全要求的不断提高,2025年防火涂料行业迎来新一轮技术革新与发展。本文基于市场调研和专业技术评测,为您呈现当下防火涂料品牌的综合排名,并提供详细的选购指南。文末附有品牌联系表单,供有需求的用…

2025年广州留学机构排名前十名:广州留学,英国留学,香港留学,新加坡留学,澳洲留学,美国留学

2025年广州留学机构排名前十名:广州留学,英国留学,香港留学,新加坡留学,澳洲留学,美国留学一、广州留学机构如何选择?五大疑问帮你理清思路作为一位拥有十余年经验的国际教育规划师,我经常被广州的学生和家长问…

selenium+pyautogui: 保存页面上图片文件,避免使用requests被限制访问

一,安装用到的库: linux # apt install python3-tk python3-dev # apt-get install xclip # apt-get install xselect # apt-get install wl-clipboard pip $ pip install pyautogui $ pip install pyperclip 二,代…

rocky安装mysql-client以及怎么找缺少的so文件

查看Linux系统版本 uname -r # 4.18.0-513.5.1.el8_9.x86_64 cat /etc/os-release # NAME="Rocky Linux" # VERSION="8.9 (Green Obsidian)" cat /proc/version # Linux version 4.18.0-513.5.1.e…

2025年玻璃钢电缆桥架源头厂家权威推荐:聚氨酯桥架/玻璃钢管箱/玻璃钢电力电缆槽源头厂家精选

在电力工程与工业配电领域,优质的玻璃钢电缆桥架正以其独特的优势成为电缆敷设系统的关键选择,其性能直接影响到线路的安全性和使用寿命。 玻璃钢电缆桥架因其耐腐蚀、轻质高强、绝缘性好等特点,在电力、通信、化工…

2025年广州留学机构哪家好:广州留学,英国留学,香港留学,新加坡留学,澳洲留学,美国留学

2025年广州留学机构哪家好:广州留学,英国留学,香港留学,新加坡留学,澳洲留学,美国留学作为一位拥有12年经验的国际教育规划师,我每天都会接触到大量广州学生和家长的咨询。2025年,留学市场依然火热,但选择中介…

质量江湖:那些年我们遇到的“君子”与“小人”

金庸老先生在《笑傲江湖》里说得好:“只要有人的地方就有恩怨,有恩怨就会有江湖。”这话放在咱们质量行业,简直再贴切不过。 《淮南子》里也有一句名言:“君子思义而不虑利,小人贪利而不顾义。”在工作中,这两种…

obsidian的smart-connections 插件连接硅基流动API

没什么用的知识,博士路上的绊脚石(bushi)obsidian的smart-connections 插件连接硅基流动API 在网上找了找没有找的怎么连接,所以来看看 需要注意的是该插件在Smart Chat 中设置 找到moedl,进行如下设置,除了调用Mo…

2025年不锈钢列管式冷凝器制造厂权威推荐榜单:化工冷凝器/新型风冷冷凝器/工业冷凝器源头厂家精选

在化工生产的复杂体系中,一台高效稳定的不锈钢列管式冷凝器,是保障企业连续安全运行的关键所在。 不锈钢列管式冷凝器作为化工、制药、新能源等行业的核心换热设备,其性能优劣直接关系到整个生产系统的效率与安全。…

【自动驾驶开源仿真平台】Carla、AirSim、Udacity self-driving-car-sim、Apollo、Autoware。 - 实践

【自动驾驶开源仿真平台】Carla、AirSim、Udacity self-driving-car-sim、Apollo、Autoware。 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bloc…

Proxmox 虚拟机忘记密码?用 GRUB 单用户模式 5 分钟重置密码(Ubuntu / Debian / CentOS 通用) - 若

当你在 Proxmox 中运行的 Linux 虚拟机提示“密码错误”,无论是因为系统崩溃、有人改了密码、还是 /etc/shadow 损坏,都可以通过 GRUB 单用户模式 快速重置。 这是最常用、最可靠、无需 ISO、不修改磁盘的解决方案。…

2025年北京留学机构排名前十名:北京留学,英国留学,香港留学,新加坡留学,澳洲留学,美国留学

2025年北京留学机构排名前十名:北京留学,英国留学,香港留学,新加坡留学,澳洲留学,美国留学一、2025年北京留学机构如何选择?五大关键问题帮你理清思路作为从事国际教育规划工作超过15年的专业人士,我经常被学生…

模拟赛Atcoder Beginner Contest 433官方题解(E题)

问题描述 给定整数 \(N, M\),一个包含 \(N\) 个整数的序列 \(X = (X_1, X_2, \dots, X_N)\),以及一个包含 \(M\) 个整数的序列 \(Y = (Y_1, Y_2, \dots, Y_M)\)。 判断是否存在一个 \(N\) 行 \(M\) 列的整数矩阵 \(A…