大厂 MCP 面试实录:Tool 调用身份认证、授权与最小权限落地实践

大厂 MCP 面试实录:Tool 调用身份认证、授权与最小权限落地实践

本文采用模拟面试复盘形式,围绕 Java MCP SDK 场景下的 RAG 知识库 Tool 调用安全治理展开,覆盖基础概念、方案设计、异常处理与工程权衡等高频考察点。


面试官:欢迎参加今天的面试,我们团队正在基于 Java MCP SDK 搭建面向内部业务的 RAG 知识库服务,需要给暴露的 Tool 增加身份认证、授权与最小权限控制。你先说说整体的安全方案设计思路?

候选人:我的整体方案会分三层落地,核心原则是"不重复造轮子,和现有业务体系对齐": 1. 传输层身份认证 :选择 Streamable HTTP 作为传输方式(适合远程多团队调用场景,比 stdio 更适配内部服务化部署资料1),利用 Java MCP SDK 提供的可插拔传输层钩子,集成团队已有的 Spring Security 体系做身份认证,避免 SDK 内置授权方案带来的生态锁定资料2。 2. Tool 层细粒度授权 :对接现有 RAG 知识库的权限体系,不做独立的授权逻辑。比如 RAG 知识库的权限是按文档分类、业务角色绑定的,授权时就校验调用用户是否有权限访问 Tool 参数中指定的文档分类,实现最小权限控制。 3. 兜底与可观测层:增加参数不可信输入校验、审计日志、异常告警能力,覆盖全链路的可追溯性。 关键取舍上,我们没有选择在 Host 层做统一认证,而是把认证能力下沉到 MCP Server 传输层,这样可以支持多 Host 共享同一个 MCP 服务,减少重复开发。


面试官:你提到要对接 RAG 知识库的权限,那如果模型调用 Tool 时传了恶意参数,比如把检索 query 改成路径遍历字符串,或者传了不属于自己的文档 ID,你怎么处理?不要只说参数 schema 校验。

候选人:首先明确一点:Tool 的参数 schema 只是结构约束,完全不能代替服务端校验和授权资料1,所以我会做两层校验: 1. 协议层校验 :利用 MCP 协议自带的 JSON Schema 能力,先校验参数的基础结构,比如 query 字段必须是字符串、长度不超过业务允许的最大值、禁止传入 /../ 等路径相关特殊字符,直接拦截不符合结构的请求,返回 MCP 标准的 InvalidParams 错误码,不会进入业务层。 2. 业务层校验 :RAG 检索的 query 属于用户传入的不可信输入资料1,除了基础过滤,还要对接 RAG 知识库的权限接口做二次校验:如果参数带了文档 ID,直接校验该用户是否有权限访问这个 ID 对应的文档;如果参数带了文档分类,校验用户是否有该分类的访问权限,没有权限直接返回 Forbidden,不会执行检索。 额外的高风险操作(比如删除 RAG 文档的 Tool)会在执行前向用户返回具体的操作影响,要求用户显式确认后再执行资料1。 还有个容易被忽略的细节:RAG 检索返回的内容会进入模型上下文,属于不可信数据,所以会增加内容安全过滤,避免文档里的恶意指令覆盖系统规则资料1

落地示例可以参考以下版本无关的授权钩子设计(基于 Java MCP SDK 传输层可插拔能力资料2):

java 复制代码
// 伪代码:Tool 执行前授权校验逻辑
public class RagToolAuthorizationHandler {
    private final RagPermissionClient permissionClient; // 对接RAG知识库权限的客户端

    public boolean authorize(McpRequest request, Principal principal) {
        // 1. 先校验身份合法性
        if (principal == null || !principal.isAuthenticated()) {
            return false;
        }
        // 2. 按Tool类型做细粒度校验
        if ("rag_search".equals(request.getToolName())) {
            String docCategory = (String) request.getParameters().get("docCategory");
            // 3. 调用RAG权限接口校验用户是否有该分类访问权限
            return permissionClient.hasPermission(principal.getName(), docCategory);
        }
        // 其他Tool的授权逻辑
        return true;
    }
}

面试官:如果出现授权失败、参数校验失败这类异常,你的处理逻辑是什么?审计日志要记录哪些内容?

候选人:异常处理分两类场景,核心原则是"不泄露敏感信息,可追溯": 1. 参数校验失败:直接返回 MCP 标准错误码,同时记录 debug 级别日志,方便排查 schema 配置问题,不会抛出业务异常,也不会把原始参数返回给模型。 2. 授权失败:返回 Forbidden 错误码给模型,同时记录审计日志,日志必须包含「调用用户 ID、Tool 名称、请求的资源范围、时间戳、结果状态」,敏感字段(比如用户输入的 query、文档 ID)必须脱敏,不能出现在日志、Tool 返回值或模型上下文中资料1。 可观测性方面,除了审计日志,还会增加调用 metrics:比如 Tool 调用成功率、失败率、平均耗时,同时配置告警规则,比如单个用户短时间内调用 Tool 超过阈值就触发限流,避免恶意调用。 关键取舍是审计日志的粒度:不能记录太细导致存储成本过高,也不能记录太粗无法排错,所以只保留核心字段,敏感信息脱敏,具体字段范围会根据合规要求调整。


面试官:RAG 知识库的权限是动态更新的,比如今天刚新增的保密文档,用户之前没有权限,现在也不应该有,你怎么保证授权不会出现滞后泄露?

候选人:核心是避免"一次授权全局生效"的误区,MCP Server 必须对每次 Tool 调用执行授权检查,不能只判断用户是否已登录资料1。 具体实现上,授权逻辑会直接调用 RAG 知识库的实时权限接口,不做长周期缓存;如果考虑到性能压力,可以做秒级到分钟级的缓存,具体时长根据业务 SLA、权限变更频率和风险承受能力确定,同时监听 RAG 知识库的权限变更事件,一旦有权限更新就主动失效对应缓存,保证权限的实时性。 最小权限的落地还会细化到参数级别:比如 RAG 检索 Tool 的权限不是笼统的"能/不能检索",而是按文档分类、甚至按文档 ID 粒度控制,用户只能调用自己有权访问的资源对应的 Tool 参数,从根源上避免越权。 这里最容易踩坑的点就是很多开发者会把授权逻辑放在用户登录时做一次,后续调用 Tool 就不再校验,这在 RAG 权限动态变更的场景下会导致严重的权限泄露。


面试官:如果这个 MCP 服务要部署给多个业务方使用,每个业务方的 RAG 知识库权限体系不一样,比如 A 业务方用 RBAC,B 业务方用 ABAC,你怎么设计才能不耦合业务方的权限逻辑?

候选人:会用策略模式 + 适配器模式解耦,适配多租户场景: 1. 抽象统一的授权接口 AuthorizationHandler,每个业务方可以实现自己的授权逻辑,比如 A 业务方实现 RBAC 策略,B 业务方实现 ABAC 策略,MCP Server 传输层根据请求中的租户 ID 动态加载对应的授权策略。 2. 抽象统一的 RAG 客户端接口 RagClient,每个业务方的 RAG 知识库实现对应的适配器,MCP Server 的 Tool 逻辑只调用统一的 RagClient 接口,不用关心具体业务方的 RAG 实现细节。 关键取舍是:这种抽象会增加一定的开发成本,适合多业务方共享 MCP 服务的场景;如果是单业务方使用,可以直接写死授权逻辑,不需要这么重的抽象,减少复杂度。 额外会做租户隔离,每个业务方的审计日志、metrics 都打上租户标签,方便排查问题。


面试官点评

  • 考察点:① MCP 安全边界的认知,能否区分协议层约束和业务层校验,理解"参数不可信"的核心原则;② Java MCP SDK 的能力边界,知道其不内置授权,需通过可插拔钩子对接现有安全体系;③ RAG 与 MCP 的协作逻辑,能否把 RAG 的权限体系和 Tool 授权结合,而非做成两个独立模块;④ 异常处理、可观测性与多租户场景的工程权衡能力。
  • 合格回答:能说出三层安全架构,明确每次 Tool 调用都需要做授权,知道审计日志需要脱敏,理解参数 schema 不能代替业务校验。
  • 加分项:能提到动态权限的缓存失效机制、策略模式解耦多租户、高风险操作的用户确认机制,以及 RAG 返回内容的不可信性处理。

总结

整个方案的核心是"借力现有体系,守住安全边界":利用 Java MCP SDK 的传输层钩子对接现有认证体系,避免重复开发;把 RAG 知识库的权限能力直接复用为 MCP Tool 的授权依据,不做重复的权限模型;同时守住"每次调用都校验、所有输入都不可信"的安全底线,配合审计和可观测能力,才能实现安全可控的 MCP Tool 服务。


参考资料

  1. MCP 基础知识
  2. MCP Java SDK,https://github.com/modelcontextprotocol/java-sdk
  3. MCP Python SDK,https://github.com/modelcontextprotocol/python-sdk
  4. Overview,https://modelcontextprotocol.io/specification/2026-07-28/basic
相关推荐
xrlfreedom4 小时前
大厂 MCP 面试实录:调用异常排查与提示注入防护的工程实践
mcp·提示注入防护·typescript mcp sdk
Ticnix6 小时前
MCP 工具拿不到 user_id?用 contextvars 做请求级用户隔离
python·agent·mcp
忧郁的橙子.6 小时前
MCP 底层原理深入解析:小模型兼容、错误容错与 Trae 调用链路
fc·mcp·开发agent
SLD_Allen6 小时前
MCP 的基本结构:Host、Client、Server、Tools、Resources、Prompts
prompts·mcp
xrlfreedom8 小时前
大厂 MCP 面试实录:Java 远程服务异常排查与安全合规设计
结构化输出·mcp·oauth 2.1·java mcp sdk
Ticnix1 天前
MCP 实战:把工具层从 Agent 里彻底解耦
python·mcp
JudithHuang1 天前
Cursor + MCP:让 Cursor 直接控制你的 Chrome
mcp
xrlfreedom1 天前
大厂 MCP 面试实录:设计需人工确认的高风险 Tool 与提示注入防护方案
prompts·mcp·rag 知识库·提示注入防护
七夜zippoe1 天前
MCP 协议详解:模型上下文协议如何重塑 Agent 工具调用生态
ai·生态·agent·模型·mcp