第 10 篇
工程技术
本机模式与令牌模式:多项目访问边界怎么设计
结合实际开发项目,讨论本机模式与令牌模式:多项目访问边界怎么设计,说明设计理由、关键源码、验证方法及适用边界。
本文目录 · 7 节
本文属于 Memory Center:AI 编程上下文与记忆系统工程实践,第 10 篇,位于“服务架构与项目边界”模块。案例背景统一采用实际开发项目;复现步骤使用脱敏教学样例,不代表特定生产事故。
从实际问题出发
同一服务既可在个人电脑运行,也可按凭据限制项目与工具。两种模式的信任假设不同:本机共享管理身份不能被描述成客户端之间已经存在私有隔离。
目录过滤与执行授权都需要
tools/list 隐藏不可见工具能减少误调用,但不能取代 call_tool 时再次检查。已有会话还要处理凭据撤销,来源引用、任务和后台任务也必须约束主体与项目。

图中展示的是本篇关注的职责和顺序。正常流程之外,还要结合下面的源码与实验检查失败分支;它不是对某次线上调用的运行时追踪。
权限跟随对象而非页面
一个用户拿到引用标识,并不等于可以读取它。对象读取时必须验证拥有者和范围;写工具还要验证写权限。管理员页面和普通项目凭据之间不能因为共用进程而产生隐式权限继承。
关键源码与阅读方法
源码基线为 Memory Center 6e90553(文档标注 5.0.0b24)。定位:memory_center/service/platform_mcp.py,函数 call_tool,起始行 45。
以下为当前基线中的函数代码;依赖项目模块,不能作为独立脚本执行。
async def call_tool(self, name, arguments):
try:
with span('authorize'):
actor=self.actor()
record=current_trace.get()
if record:
record['actor']=actor.id;record['caller']['actor']=actor.id
record['caller']['identity_assurance']='local_unverified' if self.service_config.auth_mode=='local' else 'anonymous' if actor.id=='anonymous' else 'credential'
if name not in actor.tools:
raise CatalogError('FORBIDDEN','工具不在当前凭据授权范围内')
with span('tool.execute'):
await anyio.to_thread.run_sync(lambda:self.platform.call_traces.checkpoint(record))
result=await super().call_tool(name,arguments)
# 兼容既有审计,记录故障不改变已经成功的业务结果。
try:
with span('audit'):
await anyio.to_thread.run_sync(lambda:self.platform.store.audit(actor.id,name,arguments.get('workspace_id',''),arguments.get('session_id',arguments.get('job_id',''))))
except Exception:
self.platform.call_traces.dropped+=1
return result
except CatalogError as exc:
raise ToolError(exc.code+':'+exc.message) from None
阅读时先找输入由谁提供,再区分纯计算、读取和写入;遇到异常或提前返回,追问调用方会得到什么,以及已有状态是否仍然有效。上面的代码只证明展示范围内的实现,跨模块行为应继续查看调用处和相应测试。
用一个小实验核对设计
建议在独立临时目录和隔离数据中操作,使用虚构的接口、文档与项目名称。
- 创建隔离测试凭据,只授权项目甲的查询。
- 直接调用未列出的写工具。
- 尝试读取项目乙的引用。
**要核对的结果:**目录与调用两处都应限制权限,失败不能泄露受保护正文。
可把观察记录为下表;没有执行的项写“未执行”,不能用设计预期冒充实测结果。
| 核对项 | 应保留的证据 |
|---|---|
| 使用条件 | 源码版本、配置、输入与项目范围 |
| 正常行为 | 实际返回、来源位置或状态变化 |
| 关键失败分支 | 错误码、可见结果与原状态是否保留 |
| 结论范围 | 已覆盖、未覆盖和需要进一步验证的条件 |
适用边界与继续阅读
本篇以静态源码与项目设计为依据,给出可执行的核对方法,未据此宣称已经完成新的性能或生产环境测试。不同版本的入口、默认值和底层实现可能变化,应先核对当前合同,再把方法用于自己的实际开发项目。
理解这一节后,可以回到专题总导航,沿同一模块继续阅读;顺序学习时使用专栏内的上一篇和下一篇。涉及具体技术选择,应连同本篇的代价与限制一起采用。