MCP最新企业级权限认证方案 STDIO与SSE实现详解
在企业级MCP方案实际部署中,权限控制是必须解决的关键问题。不能允许任意用户直接访问MCP Server,更常见的情况是,不同用户访问时应当返回差异化数据,这就涉及到MCP Server的授权管理机制。 MCP Server支持两种数据传输模式,它们的授权实现路径也有所不同,下面将分别详解。 STD
在企业级MCP方案实际部署中,权限控制是必须解决的关键问题。不能允许任意用户直接访问MCP Server,更常见的情况是,不同用户访问时应当返回差异化数据,这就涉及到MCP Server的授权管理机制。

MCP Server支持两种数据传输模式,它们的授权实现路径也有所不同,下面将分别详解。
STDIO
这种模式在本地环境下运行,启动MCP Server的方式较为特殊——直接将其作为子进程来执行。所谓的标准输入输出,实质上就是通过运行命令,向控制台写入信息、读取信息,依靠这种交互来传输数据。
在实际配置中,通常会编写一段JSON,例如下面这个百度地图的MCP Server示例:
- command和args这两个字段,用于指定要运行的命令及其参数。
- 而env中的BAIDU_MAP_API_KEY,才是实现授权控制的关键所在。
如果传入的BAIDU_MAP_API_KEY不正确,那么对应的权限就会被拒绝。
"baidu-map": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"@baidumap/mcp-server-baidu-map"
],
"env": {
"BAIDU_MAP_API_KEY": "LEyBQxG9UzR9C1GZ6zDHsFDVKvBem2do"
}
},
因此,STDIO实现授权的方式非常直接:借助env(环境变量)来完成。具体步骤仅需三步:
- 服务端首先向用户发放一个凭证(可以是密钥、Token等,方式不限)。此处细节不再展开,但必须有一个授权中心来颁发凭证。
- 随后MCP Client通过env将凭证传入。
- 最后MCP Server从环境变量中读取凭证并进行鉴权。
在MCP Server端,通过System.getenv()即可获取env中的变量:
@Tool(description = "获取用户余额")
public String getScore() {
String userName = System.getenv("API_KEY");
// todo .. 鉴权处理
return "未检索到当前用户"+userName;
}
当然,也可以采用AOP的方式进行统一处理,使代码结构更加优雅。
不过需要特别指出:这种模式不支持动态鉴权。你无法在运行过程中随意更换环境变量。因为STDIO是在本地运行的,MCP Server作为子进程启动。如果多个用户需要动态切换凭证,他们就会争夺共享的环境变量,最终只能保留一个。除非为每个用户单独启动一个STDIO MCP Server,但这显然不现实,性能无法承受。因此,若需实现多用户动态切换授权,则必须依赖SSE模式。
SSE
说明
若要将MCP服务器开放给外部使用,就需暴露标准的HTTP接口。私有场景下身份认证要求可能不高,但在企业级部署中,安全权限变得至关重要。2025年3月发布的最新MCP规范直接引入了安全基础,采用了广泛使用的OAuth2框架。
OAuth2的具体细节此处不再赘述,但对其进行简要回顾十分必要。
在规范草案中,MCP服务器同时扮演资源服务器和授权服务器的角色。
- 作为资源服务器,MCP负责检查每个请求中的
Authorization请求头。该请求头必须包含OAuth2的access_token(令牌),它相当于客户端的“通行证”。该令牌通常是JWT(JSON Web Token),也可能是一个不可读的随机字符串。如果令牌缺失或无效(例如无法解析、已过期、不是发给本服务器等),请求将被直接拒绝。正常调用示例如下:
curl https://mcp.example.com/sse -H "Authorization: Bearer <有效的 access token>"
- 作为授权服务器,MCP还需具备安全签发
access_token的能力。在发放令牌前,它会校验客户端的凭据,有时还需要校验访问用户的身份。授权服务器决定了令牌的有效期、权限范围、目标受众等特性。
借助Spring Security和Spring Authorization Server,可以很方便地为现有的Spring MCP服务器添加这两大安全能力。
给Spring MCP服务器加上OAuth2支持
以官方示例仓库中的“天气”MCP工具为例,核心目标是让服务器既能签发令牌又能校验令牌。
首先,在pom.xml中引入必要的依赖:
org.springframework.boot
spring-boot-starter-oauth2-resource-server
org.springframework.boot
spring-boot-starter-oauth2-authorization-server
接下来,在application.properties中配置一个简易的OAuth2客户端信息,方便后续请求令牌:
spring.security.oauth2.authorizationserver.client.oidc-client.registration.client-id=xushu
spring.security.oauth2.authorizationserver.client.oidc-client.registration.client-secret={noop}xushu666
spring.security.oauth2.authorizationserver.client.oidc-client.registration.client-authentication-methods=client_secret_basic
spring.security.oauth2.authorizationserver.client.oidc-client.registration.authorization-grant-types=client_credentials
配置完成后,可以直接通过POST请求与授权服务器交互,无需浏览器,使用已配置的/secret作为固定凭证。最后一步是启用授权服务器和资源服务器的功能。通常需要新增一个安全配置类,例如SecurityConfiguration:
import static org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer.authorizationServer;
@Configuration
@EnableWebSecurity
class SecurityConfiguration {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
.with(authorizationServer(), Customizer.withDefaults())
.oauth2ResourceServer(resource -> resource.jwt(Customizer.withDefaults()))
.csrf(CsrfConfigurer::disable)
.cors(Customizer.withDefaults())
.build();
}
}
该过滤链完成了以下任务:
- 要求所有请求都通过身份认证,即访问MCP接口时必须携带access_token。
- 同时启用授权服务器和资源服务器两大功能。
- 关闭CSRF(跨站请求伪造防护),因为MCP并非为浏览器直接使用,无需开启。
- 开启CORS(跨域资源共享),方便使用MCP inspector进行测试。
配置完成后,只有携带access_token的访问才会被接受,否则直接返回401未授权错误:
curl http://localhost:8080/sse --fail-with-body
# 返回:
# curl: (22) The requested URL returned error: 401
要使用MCP服务器,需先获取一个access_token。可通过client_credentials授权方式(适用于机器到机器、服务账号等场景)获取:
curl -XPOST http://localhost:8080/oauth2/token --data grant_type=client_credentials --user xushu:xushu666
# 返回:
# {"access_token":"","token_type":"Bearer","expires_in":299}
将返回的access_token记录下来(通常以“ey”开头),之后就可以用它正常请求服务器了:
curl http://localhost:8080/sse -H"Authorization: Bearer YOUR_ACCESS_TOKEN"
# 服务器响应内容
你还可以在MCP inspector工具中直接使用这个access_token。在菜单的Authentication > Bearer处粘贴令牌,然后连接即可。
为MCP Client设置请求头
目前,MCP的Java SDK并未提供直接调用的API。研究过源码后,发现只有两种实现方式:
重写源码
一种方法是彻底重写MCP SSE方式的Java SDK源码。虽然工作量较大,但可以预见的是,不久之后Spring AI和MCP协议都会对此进行更新。具体方案取决于你的紧急程度。如果更注重整体扩展性和可维护性,整体重写也是一种值得考虑的方案。
这里提供一个重写思路:
重写McpSseClientProperties
在MCPSse客户端的属性配置中新增请求头字段:
package org.springframework.ai.autoconfigure.mcp.client.properties;
@ConfigurationProperties("spring.ai.mcp.client.sse")
public class McpSseClientProperties {
public static final String CONFIG_PREFIX = "spring.ai.mcp.client.sse";
private final Map connections = new HashMap();
private final Map headersMap = new HashMap<>();
private String defaultHeaderName;
private String defaultHeaderValue;
private boolean enableCompression = false;
private int connectionTimeout = 5000;
// ... 省略 getter/setter ...
}
重写SseWebFluxTransportAutoConfiguration
在自动装配时添加请求头配置信息:
package org.springframework.ai.autoconfigure.mcp.client;
@AutoConfiguration
@ConditionalOnClass({WebFluxSseClientTransport.class})
@EnableConfigurationProperties({McpSseClientProperties.class, McpClientCommonProperties.class})
@ConditionalOnProperty(
prefix = "spring.ai.mcp.client",
name = {"enabled"},
ha vingValue = "true",
matchIfMissing = true
)
public class SseWebFluxTransportAutoConfiguration {
// ... 核心逻辑,在构建WebClient时注入headersMap ...
}
设置WebClientCustomizer
在使用Spring-ai-M8版本时,发现它提供了WebClientCustomizer扩展机制。可以尝试以下方式:
- 先根据用户凭证进行授权:
curl -XPOST http://localhost:8080/oauth2/token --data grant_type=client_credentials --user xushu:xushu666
- 然后根据授权后得到的token发起请求:
@Bean
public WebClientCustomizer webClientCustomizer() {
return (builder) -> {
builder.defaultHeader("Authorization","Bearer eyJraWQiOiIzYmMzMDRmZC02NzcyLTRkYTItODJiMy1hNTEwNGExMDBjNTYiLCJhbGciOiJSUzI1NiJ9...");
};
}
需要特别说明:SSE模式支持动态切换Token,因为每个请求都是全新的HTTP请求,不会出现多线程争抢的情况。如果需要动态授权,每次可以重新执行 curl -XPOST http://localhost:8080/oauth2/token --data grant_type=client_credentials --user xushu:xushu666 来获取新的令牌。
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:MCP最新企业级权限认证方案 STDIO与SSE实现详解要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
相关热点AI SEO产品全面解析与功能指南AI SEO平台的核心价值在于解决一个常见痛点:AI生成的内容往往带有明显的机器痕迹,读起来生硬枯燥,难以获得搜索引擎的青睐。该平台提供了一整套工具与服务,能够将机械感十足的文本转化为自然流畅、如同人类撰写的优质文章。听起来很贴合实际需求,不是吗?下面我们来详细了解
对于经常处理电子表格的用户来说,Goodlookup这款工具确实值得深入了解。它巧妙地将AI语言模型的智能能力融入常见的表格操作流程,即使是普通用户也能轻松调用AI辅助功能,从而显著提升日常办公效率与数据处理体验。
ResearchBuddy app是什么 对于从事学术研究的学者或学生而言,文献综述往往是最耗时耗力的环节。海量论文需要筛选,光是阅读摘要就可能消耗大半天。ResearchBuddy app正是为解决这一痛点而生的AI辅助工具,由专业团队开发,专为研究人员、学生及需要系统梳理文献的专业人士设计。其核
Writecream产品介绍 Writecream这个AI写作工具,说实话,在同类产品里算是一把好手。它的核心卖点就一个字:快。无论是冷邮件、营销文案还是社交媒体帖子,几秒钟就能给你整出一篇像样的东西。这意味着什么?意味着你花在内容创作上的时间成本和金钱成本都能大幅压缩。下面具体看看它都有哪些拿手好
- 日榜
- 周榜
- 月榜
热点快看
