游乐游手机版
首页/AI热点日报/热点详情

MCP最新企业级权限认证方案 STDIO与SSE实现详解

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

在企业级MCP方案实际部署中,权限控制是必须解决的关键问题。不能允许任意用户直接访问MCP Server,更常见的情况是,不同用户访问时应当返回差异化数据,这就涉及到MCP Server的授权管理机制。

MCP最新企业级权限认证方案,STDIO/SSE不同实现详解!

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(环境变量)来完成。具体步骤仅需三步:

  1. 服务端首先向用户发放一个凭证(可以是密钥、Token等,方式不限)。此处细节不再展开,但必须有一个授权中心来颁发凭证。
  2. 随后MCP Client通过env将凭证传入。
  3. 最后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扩展机制。可以尝试以下方式:

  1. 先根据用户凭证进行授权:
curl -XPOST http://localhost:8080/oauth2/token --data grant_type=client_credentials --user xushu:xushu666  
  1. 然后根据授权后得到的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 来获取新的令牌。

来源:https://www.53ai.com/news/zhishiguanli/2025052157814.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。