这是《LLM 应用开发 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 LLM 应用必须继承企业已有的身份、租户、角色和数据权限体系。模型不能决定用户能看什么,所有数据访问都应由服务端在检索或查询前强制过滤。
24.1 身份链路
User
-> Identity Provider
-> Access Token
-> Gateway
-> Application
-> Retrieval / Tools / DB
每次请求都要确定:
- 用户 ID;
- 租户 ID;
- 角色;
- 组;
- 数据范围;
- 会话 ID;
- 审批权限;
- 令牌有效期。
不能仅靠前端传来的 user_id。
24.2 权限模型
| 模型 | 示例 | 特点 |
|---|---|---|
| Own | 用户只看自己数据 | 常见默认 |
| Role | 客服、经理、管理员 | 简单清晰 |
| Group | 项目组共享 | 适合协作 |
| ACL | 文档级访问列表 | 细粒度 |
| ABAC | 按属性动态判断 | 灵活复杂 |
示例:
{
"tenant_id": "tenant-a",
"user_id": "u-100",
"roles": ["cs_agent"],
"groups": ["north_region"],
"data_scope": {
"order": "assigned_or_own",
"doc": ["public", "internal", "cs_kb"]
}
}
24.3 RAG 边界
错误流程:
向量检索 top K
-> 应用层再过滤权限
风险:相关文档可能因未带权限而被过滤掉,或实现失误导致泄露。
正确流程:
认证
-> 构造过滤条件
-> 检索时执行 tenant/acl/status
-> rerank
-> 引用再校验
查询条件必须包含:
- tenant;
- ACL;
- 文档状态;
- 生效时间;
- 数据区域;
- 业务归属。
24.4 工具边界
工具不应直接暴露内部服务,应包一层授权:
def list_orders(args, current_user):
if current_user.is_agent:
return db.orders.filter(assignee_id=current_user.id)
return db.orders.filter(user_id=current_user.id)
边界原则:
- 工具凭证最小权限;
- 服务间调用认证;
- 写操作有独立授权;
- 查询范围绑定当前用户;
- 分页限制;
- 字段投影;
- 审计。
24.5 会话隔离
会话可能跨设备和跨时间,但权限必须实时计算。
风险场景:
- 用户登出后继续使用旧 token;
- 角色变更后仍访问旧文档;
- 共享设备保留上下文;
- 缓存跨用户复用;
- 多租户系统缓存键缺失。
处理:
- token 校验和刷新;
- 权限版本检查;
- 缓存键包含权限主体;
- 登出清理会话;
- 高敏操作重新认证;
- 管理员切换身份时重置上下文。
24.6 脱敏
| 场景 | 策略 |
|---|---|
| 送入模型 | 最小必要字段 |
| 日志 | 摘要和脱敏 |
| 评测 | 保留格式替换值 |
| 展示 | 按角色部分隐藏 |
| 外部服务 | 默认不发送 |
| 审计 | 必要时加密保存 |
示例:
手机号:138****5678
身份证:110***********1234
银行卡:**** **** **** 1234
24.7 多租户
隔离方式:
| 方式 | 安全性 | 成本 |
|---|---|---|
| 共享表 + tenant_id | 中 | 低 |
| 独立 schema | 较高 | 中 |
| 独立数据库 | 高 | 高 |
| 独立索引 | 较高 | 中 |
无论哪种方式,应用查询必须强制 tenant 条件,并防止缓存、对象存储和日志串租户。
24.8 审批
Agent 请求高危动作
-> 生成动作详情
-> 检查权限
-> 用户或审批人确认
-> 服务端执行
-> 回执和审计
审批要绑定:
- 请求 ID;
- 目标资源;
- 变更内容;
- 操作者;
- 审批者;
- 时间;
- 版本或状态;
- 结果。
24.9 测试
权限测试必须包含:
- 未登录;
- token 过期;
- 跨用户读;
- 跨租户读;
- 角色降级;
- 文档 ACL 变化;
- 缓存命中;
- 引用输出;
- 工具参数替换;
- 高危操作未审批。
这些用例应自动化并阻止发布。
本章小结
权限和数据边界必须由服务端强制执行。检索前过滤、工具包装授权、缓存隔离、实时校验和高危审批是关键点。模型只能处理已经授权的数据,不能成为权限判断点。
思考题
- 为什么不能先检索再由应用补权限?
- 会话缓存如何避免跨用户泄露?
- 工具凭证为什么要最小权限?
- 角色变更后如何让权限及时生效?
- 高危动作审批应记录哪些信息?