MCP学习:手把手教你扩展SpringAI MCP Server源码,轻松实现认证鉴权!
本文针对MCPServer服务在集中式对外提供HTTPSSE模式时的安全问题,提出了一套轻量级鉴权方案。传统OAuth方案复杂度较高,作者推荐采用API-Key/Bearer的HTTP请求头/参数鉴权方式,类似百度地图的AK参数模式。技术实现上,通过扩展SpringAIMCPServer源码,引入阿里TTL处理跨线程数据共享,重构TransportProvider类支持双鉴权模式(请求头和URL参
01.前言
来看一段AI大模型对它的介绍
目前大多数开发者都开始基于MCP来搭建自己的MCP Server了,很多公司的业务也开始逐步使用MCP来解决日常的业务提效场景,那么在开发前,我们都需要进行功能需求的技术方案设计与评审,这里面多数都会关注一个点的设计:安全。
对于MCP Server来说,默认大多数情况下都是无任何权限校验提供给别人访问的,那么实际上,很多用MCP Server的小伙伴都会关注一个事情,这个东西给别人使用时,安全方面如何保障呢。
如何给别人提供一个支持鉴权能力的MCP Server呢?
理论上这种通用的方案应该是MCP协议的开发者来想,但是以前的MCP Server大多数都是基于STDIO模式基于本地工具环境的访问方式,不安全没关系,但是更改为HTTP SSE这种集中式对外提供服务的模式方式后,这种统一给别人提供服务的方式就需要通过鉴权来进行业务访问了,从而确保企业的内的服务是可靠和稳定的。
目前,官方的一个方式是基于OAuth的方式实现鉴权,熟悉的小伙伴可能会感觉用这个协议的方式来开发一个支持鉴权的MCP Server过于重了,普通的开发者还得去学习,去开发一些配置复杂的代码,学习成本和开发成本都比较高。
比较简单和合适的一种方案就是基于API-Key/Bearer这种基于HTTP 请求头的方式或者请求参数的方式来实现请求的授权传递和认证授权的解析。
例如百度地图的MCP Server是通过请求参数提供服务的:
{"mcpServers": {"baidu-maps": {"url": "https://mcp.map.baidu.com/sse?ak=您的AK"}}}
通过这种认证授权方案,我们会发现好像和我们之前的项目开发的流程类似,只需要在HTTP请求头中或者请求参数中传递好认证的授权Key,然后服务端校验一下就行了。从而根据这种机制方案验证客户端的访问身份、确定权限范围后分配有权限的工具列表、验证通过执行验证失败拒绝执行等等。
02.方案说明
玩法1:基于HTTP请求头的方式:

服务端查询到请求头后,可以查询数据库或者Redis验证请求的Key是否存在,是否合法,是否在有效期范围内。
玩法2:基于HTTP请求参数的方式:

服务端查询到请求参数后,可以查询数据库或者Redis验证请求的Key是否存在,是否合法,是否在有效期范围内。
那么基于这样的一个设计该如何开发呢?
这里分享我的代码设计方案:
通过对现有的Spring AI MCP Server的源码扩展,从源码层面支持HTTP请求头的解析,从而实现授权。
那么,对于HTTP SSE类型的MCP Server来说,从原理层面我们需要知道2点:
(1)、客户端会先通过/sse请求进行会话连接
(2)、客户端然后再通过/messages请求进行消息的传递
流程图如下:

Spring AI MCP Server的公共框架层面已经帮我们做了连接的初始化和流转,我们需要再此基础之上,进行增强。
03.正文
了解了这个原理后,我们接下来就开始扩展下Spring AI MCP Server的源码,增加上我们的信息。
1、首先我们在已有的Spring AI MCP Server的工程中增加一个阿里TTL的依赖,作为跨线程数据传递共享的处理。
<dependency><groupId>com.alibaba</groupId><artifactId>transmittable-thread-local</artifactId><version>2.14.3</version></dependency>
用这个TTL的原因在于我们的Spring AI MCP框架层的处理线程和实际Service中的线程不是一个,如果想通过传统的RequestContextHolder类获取当前请求信息,获取不到,需要特殊处理下,所以后续如果想在业务方法中获取请求信息时,需要用支持跨线程的TTL对象。
2、然后我们创建个McpAuthRequestContext类,用于维护当前请求线程的中的数据的存储,比如API-KEY的传递:

3、然后我们在IDEA当前环境中找到这个依赖的WebMVC的类:
WebMvcSseServerTransportProvider
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
我们把这个类的源码拿出来,将整个文件的内容拿出来,复制到项目中,然后重命名为:
SupportAuthMcpServerTransportProvider
并替换当前代码中的原来的类名称为新的类名称。
然后我们在启动类中增加如下代码,实现代码的覆盖:

这样操作完成后,我们的基本架子是OK的,为什么要这么做呢,这样改造为什么呢?
首先我们需要了解下Spring AI中MCP Server的基础能力是如何实现的,我们查看下这个自动装配类:
McpWebMvcServerAutoConfiguration
在原来的基于MVC的HTTP SSE的类中,就是这样的一个设计,通过定义构造一个MCP的传输层的对象和用于响应的路由函数对象进行提供服务,我们这里其实也是在重写一个传输层的Provider的方式,从而实现扩展:

那么我们准备的这个类,Spring AI的框架层是怎么用的呢?
这里可以看下这个装配类:
McpServerAutoConfiguration
这个类中会依赖我们的这个Provider对象,从而给MCP Server提供能力。

这样我们执行链路明白了以后,我们继续扩展我们的认证授权代码。核心还是修改我们复制重写的类:
SupportAuthMcpServerTransportProvider
这个类在初始化的时候,构造了2个执行的请求路由:
this.routerFunction = RouterFunctions.route().GET(this.sseEndpoint, this::handleSseConnection).POST(this.messageEndpoint, this::handleMessage).build();
因此,我们做授权,可以在这两个路由中进行业务的处理和实现。
接下来定义下授权拦截器的接口:


这里我们判断了当前的key是否合法,当前会话创建前的时候。
接下来修改provider类,将拦截器作为扩展参数传递到构造函数中:

这样外部逻辑可以传入自己的拦截器的设计实现。
然后找到会话的链接创建的方法,增加上拦截器的判断逻辑:

在找到message处理的逻辑,增加上拦截器的方法:

然后我们在启动类中增加上初始化的方法:

这样支持授权认证的服务端的MCP Server就完成了,接下来,我们拿客户端测试下:
先输入一个错误的值:


修改为正确的请求头后,我们可以看到正确的结果。
并成功地访问了message接口。

目前的这个演示是基于请求头的方式,我们也可以继续优化,支持一下基于请求参数的方式实现授权的认证,继续改造代码为如下的方式:

这里增加了逻辑,先判断是否有请求头,再判断是否请求参数,可以支持2种权限判断业务逻辑处理。
在MCP客户端中测试也开始OK的:

04.总结
在本文的设计中,其实如果仔细深入去做还有很多可以继续优化和开发的点,比如:
1、按照标准的方式提供请求头的解析
我们知道标准通用的请求头的格式为:
Authorization: Bearer xxxxxxx
那么我们获取到这个请求头字符串的时候,在增强一下解析的代码:
if (requestAuthHeader == null || !requestAuthHeader.startsWith("Bearer ")) {return false;}String token = requestAuthHeader.substring("Bearer ".length()).trim();if (token.isEmpty()) {return false;}
2、增加一些设计模式的集成
比如单例模式、策略模式、观察者设计模式也可以使用。再结合一些具体的日志行为进行处理。通过策略模式对接不同的授权方式。
3、区分不同请求的鉴权处理
针对不同的MCP请求进行判断处理,避免每个请求都进行复杂的权限校验,并提供基于内存方式的令牌校验和Redis方式的令牌校验。
大模型&AI产品经理如何学习
求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
1.学习路线图

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。


(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方图片前往获取
3.技术文档和电子书
这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。

4.LLM面试题和面经合集
这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集***
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)