在 AI 集成的狂飆時代,Spring AI 的 MCP 協議 + OAuth2 才是安全感天花板!
在 AI 集成領域卷得飛起的當下,保證 AI 模型和外部工具之間通信安全,那可是頭等大事。Spring AI 的模型上下文協議(MCP)本來就很擅長搞定這種交互,如今又更新了一波 —— 把 OAuth2 這層 “安全鎧甲” 嵌進去的操作,簡直比喝奶茶加珍珠還絲滑。
1.為啥 MCP 非得配上 OAuth2?
MCP 服務器要是在本地用 STDIO 傳輸,那倒還好說。可一旦要把它暴露到外部網絡(尤其是企業環境里),沒點靠譜的身份驗證和權限管理,那不就跟家門沒鎖一樣危險?好在最新版 MCP 規范(截至 2025 年 3 月 26 日)已經想到了這茬,直接抱上了 OAuth2 這個 “業界網紅” 框架的大腿,給客戶端和服務器的安全通信打了個穩穩的地基。
2.一人分飾兩角:MCP 服務器既是 “資源管家” 也是 “授權官”
在這套配置里,MCP 服務器直接扛起了兩個關鍵角色,堪稱 AI 界的 “斜杠青年”:
- 它會盯著請求里的 Authorization 頭,檢查有沒有有效的 OAuth2 訪問令牌(access_token)。這令牌可能是 JWT 格式,也可能是段 “不明覺厲” 的字符串,但它代表著客戶端的 “權限通行證”。要是令牌沒帶或者是假的?不好意思,服務器直接把請求攔在門外。
- 客戶端先亮出自己的 “身份證明”,它驗證通過后才會發 access_token。而且令牌的 “保質期”(過期時間)、能干嘛(權限范圍)、給誰用(目標受眾),全由它說了算。
3.手把手教你給 Spring MCP 服務器裝 OAuth2 “安全鎖”
咱就拿 Spring AI 示例倉庫里的 “天氣查詢” MCP 工具舉例,一步步把 OAuth2 嵌進去,操作簡單到像拼樂高:
1)先把必備 “零件”(依賴)裝上
第一步,在 pom.xml 里加好 Spring Boot 的 “啟動器”,少了它們可不行:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
</dependency>2)給 OAuth2 客戶端 “填檔案”
在 application.properties 里,把 OAuth2 客戶端的信息配置好,就像給新員工錄入職信息:
spring.security.oauth2.authorizationserver.client.oidc-client.registration.client-id=mcp-client
spring.security.oauth2.authorizationserver.client.oidc-client.registration.client-secret={noop}secret
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這套配置是給 “機器對機器” 交互用的,用了 client_credentials 授權模式,簡單直接,不整花活。
3)搭好 “安全防護網”(安全配置)
建個 SecurityConfiguration 類,把安全過濾鏈定義清楚,相當于給服務器裝上門禁系統:
@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();
}
}這套配置的作用,咱一句話說明白:
- 所有請求都得先 “刷臉”(驗證身份)才能過;
- 授權服務器和資源服務器的功能全給開了;
- 關了 CSRF 保護(非瀏覽器客戶端用不上,純屬多余);
- 開了 CORS 支持(跨域請求也能正常走)。
4)拿令牌、發請求,一步到位
想跟加了 “安全鎖” 的 MCP 服務器互動?先得搞到 access_token,用 curl 一行命令搞定:
curl -XPOST http://localhost:8080/oauth2/token \
--data grant_type=client_credentials \
--user mcp-client:secret執行完會返回一個 JSON,里面就有你要的 access_token。
接下來用這個令牌發請求,把 “YOURACCESSTOKEN” 換成剛拿到的令牌就行:
curl http://localhost:8080/sse \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"4.下一步該干啥?
OAuth2 的基礎配置搞定后,接下來就該給客戶端認證 “升個級” 了。比如整個 “授權碼”(authorization code)授權模式,讓用戶能輸自己的賬號密碼登錄,再配合基于角色的訪問控制(RBAC),權限管理能細到 “誰能看天氣、誰能改天氣數據”。
想親手試試?直接去 spring-ai-examples 倉庫看示例代碼,照著敲一遍就懂了。
說到底,給 Spring AI 的 MCP 服務器嵌上 OAuth2,就像給 AI 系統裝了個 “智能安全門”—— 既保證了訪問安全,又能精準控制權限,為搞大規模、高安全的 AI 集成打下了好底子。






























