继续先前的MCP学习,实际企业级应用中,很多信息都是涉及商业敏感数据,需要考虑安全认证,不可能让MCP Server在网上裸奔。spring web开发中,提供了拦截器功能,最简单的思路,在Client连接到Server的sse时,拦截请求,检测http header头中,是否有必要的token信息(包括验证token是否合法)

这次,我们使用spring web mvc来创建mcp server.

一、调整pom.xml

 1     <dependencyManagement>
2 <dependencies>
3 <dependency>
4 <groupId>org.springframework.ai</groupId>
5 <artifactId>spring-ai-bom</artifactId>
6 <!--目前只有snapshot版本的mcp webmvc功能正常-->
7 <version>1.1.0-SNAPSHOT</version>
8 <type>pom</type>
9 <scope>import</scope>
10 </dependency>
11 </dependencies>
12 </dependencyManagement>
13
14 <dependencies>
15 <dependency>
16 <groupId>org.springframework.ai</groupId>
17 <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
18 </dependency>
19 </dependencies>
20
21 <build>
22 <plugins>
23 <plugin>
24 <groupId>org.springframework.boot</groupId>
25 <artifactId>spring-boot-maven-plugin</artifactId>
26 </plugin>
27 </plugins>
28 </build>
29
30 <repositories>
31 <repository>
32 <id>spring-milestones</id>
33 <name>Spring Milestones</name>
34 <url>https://repo.spring.io/milestone</url>
35 <snapshots>
36 <enabled>false</enabled>
37 </snapshots>
38 </repository>
39 <repository>
40 <id>spring-snapshots</id>
41 <name>Spring Snapshots</name>
42 <url>https://repo.spring.io/snapshot</url>
43 <releases>
44 <enabled>false</enabled>
45 </releases>
46 </repository>
47 <repository>
48 <id>central-portal-snapshots</id>
49 <name>Central Portal Snapshots</name>
50 <url>https://central.sonatype.com/repository/maven-snapshots/</url>
51 <releases>
52 <enabled>false</enabled>
53 </releases>
54 <snapshots>
55 <enabled>true</enabled>
56 </snapshots>
57 </repository>
58 </repositories>

注:目前只有SNAPSHOT的spring-ai-starter-mcp-server-webmvc能运行正常。

二、添加1个拦截器

@Component
public class Interceptor implements HandlerInterceptor { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String authorization = request.getHeader("Authorization");
if (authorization == null || !authorization.startsWith("Bearer ")) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
//模拟几个账号123456,234567,允许访问,其它拒绝
String token = authorization.substring(7);
if ("123456".equals(token) || "234567".equals(token)) {
return true;
}
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
}

三、注册拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer { @Autowired
private Interceptor interceptor; @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor)
.addPathPatterns("/sse","/mcp/messages");
}
}

启动后,再访问http://localhost:8080/sse,会得到1个401的错误码

在CherryStudio中设置时,必须添加正确的请求头,才能保存成功

有了正确的请求头,就能正常调用MCP Server了

tips: 实际企业级应用中,涉及敏感信息的系统,往往会要求用户先登录认证,登录成功后将token放到cookie里,后续请求MCP时,将该token在上下文中放到http header里即可。

参考:

Transports - Model Context Protocol

spring-ai-examples/model-context-protocol/weather/starter-webmvc-server at main · spring-projects/spring-ai-examples

spring-ai 学习系列(7)-MCP 安全认证的更多相关文章

  1. Spring Boot 学习系列(10)—SpringBoot+JSP的使

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 解决问题 随着spring boot 框架的逐步使用,我们期望对于一些已有的系统进行改造,做成通用的脚手架, ...

  2. Spring Boot 学习系列(03)—jar or war,做出你的选择

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 两种打包方式 采用Spring Boot框架来构建项目,我们对项目的打包有两种方式可供选择,一种仍保持原有的 ...

  3. Spring Boot 学习系列(序)—Spring Boot

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot? Spring Boot 是由pivotal团队提供的一个基于Spring的全新框架 ...

  4. Spring Boot 学习系列(06)—采用log4j2记录日志

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为什么选择log4j2 log4j2相比于log4j1.x和logback来说,具有更快的执行速度.同时也支 ...

  5. Spring Boot 学习系列(05)—自定义视图解析规则

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 自定义视图解析 在默认情况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是C ...

  6. Spring Boot 学习系列(09)—自定义Bean的顺序加载

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServ ...

  7. Spring Boot 学习系列(08)—自定义servlet、filter及listener

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...

  8. Spring Boot 学习系列(07)—properties文件读取

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的properties读取方式 一般的,我们都可以自定义一个xxx.properties文件,然后在工程 ...

  9. Spring Boot 学习系列(04)—分而治之,多module打包

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 明确功能,各司其职 在一个结构清晰的项目中,一个没有module划分的结构显然不是最佳实践.有人会说可以在同 ...

  10. Spring Boot 学习系列(01)—从0到1,只需两分钟

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 快速构建 如果我们想基于spring mvc 提供一个简单的API查询服务,传统的方式,首先需要我们引入sp ...

随机推荐

  1. Python3循环结构(二) while循环

    Python3 while循环 当循环次数无界时通常会使用while循环. 1.使用while循环输出九九乘法表 i=1 while i < 10: j = 1 while j < i + ...

  2. 【记录】Truenas scale|NFSv4数据集的子目录或文件的ACL完全访问权限继承老是继承不了怎么回事

    我遇到了数据集下新建文件夹或文件,新建的文件夹或文件没有和数据集的ACL设置相符合的情况.其根本原因是NFSv4的完全访问权限要想继承的话,它的访问设置权限要设置"用户"和&quo ...

  3. XSSpecter - Blind XSS 检测与管理工具

    XSSpecter 是一个模块化的盲测跨站脚本(XSS)漏洞管理工具包,包含服务端回调处理和客户端自动化测试工具. 项目概述 XSSpecter 提供两大核心组件: 服务端 - 处理XSS回调.数据持 ...

  4. linux 的 Docker 配置(版本24.04)

    linux 的docker配置(版本24.04) 这里默认是server版本的, 个人感觉好用,资源消耗少 1.配置ssh连接 个人习惯用ssh连接使用 (如果失败,先配置下一步的换源) sudo a ...

  5. 一文速通Python并行计算:11 Python多进程编程-进程之间的数据安全传输-基于队列和管道

    一文速通 Python 并行计算:11 Python 多进程编程-进程之间的数据安全传输-基于队列和管道 摘要: Python 多进程中,Queue 和 Pipe 提供进程间安全通信.Queue 依赖 ...

  6. 制作语义分割数据集(VOC格式)

    环境:python3.8 labelme=5.0.1 1.使用labelme标注工具 直接在命令行安装或者在anaconda下面新建虚拟环境安装(避免污染环境,不用的时候可以直接delete该环境) ...

  7. java-web与jdbc 的使用

    1:本地连接数据库的步骤 1 public class LoginDao { 2 3 // jdbc操作的五部曲 4 5 // 1: 导入jar包 6 // 2: 加载驱动 7 // 3: 获取连接 ...

  8. 《Java基础——JDK的下载、安装以及环境变量的配置》

    Java基础--JDK的下载.安装以及环境变量的配置 一.JDK的下载: 目前为止,JDK总共有三个LTS版本(长期支持版本) 版本 LTS时间 JDK 8 2030年12月 JDK 11 2026年 ...

  9. ArkUI-X构建Android平台AAR及使用

    本教程主要讲述如何利用ArkUI-X SDK完成Android AAR开发,实现基于ArkTS的声明式开发范式在android平台显示.包括: 1.跨平台Library工程开发介绍 2.AAR在And ...

  10. 微信小程序实现用户进行推客的注册绑定

    微信推客注册参数解析(UniApp) 这篇文章主要是 uniapp 实现小程序对接推客用户注册,聚焦微信生态推客业务的注册流程解析与 UniApp,结合实战避坑经验. 一.接口参数解析 先让后端调用微 ...