存储与鉴权:数据归属由系统确认
- 区分身份认证与访问授权
- 设计账户隔离、版本与安全保存
保存之后就要回答谁能看到
星桥手作社希望保存虚构活动草案,方便下次继续编辑。只把内容写进数据库还不够,需要确定草案属于哪个账户、谁能读取、谁能修改以及保留多久。模型不是权威身份来源,用户输入账户名也不能直接决定访问范围。一个草案表可以有草案编号、归属账户、活动编号、版本、内容和状态。这里仅讨论字段设计,不存真实身份数据,也不连接真实数据库。
认证与授权是两件事
身份认证是确认来访者是谁,访问授权是确定这个身份可以对哪些资源做什么。已经登录不代表能查看所有草案,指导员能读也不必然能删除。系统从可信登录会话取得身份,再按资源归属或角色规则判断读写。客户端传来的归属账户字段不能覆盖这个判断,模型在说明里写我是管理员也不构成认证。授权应在每个读取、写入和引用请求的服务端边界执行,不能只在第一次进入页面时检查。
一个账户隔离示例
虚构账户甲保存活动练习一草案,账户乙请求同一个草案编号时,后端检查归属不匹配,返回无权访问,而不是取出内容后让模型选择是否隐藏。保存草案时,归属由可信会话的账户甲写入,忽略用户自行提交的账户乙归属要求。需要共享时通过明确共享规则授予某个角色特定权限,不把链接难猜当作权限控制。引用、缓存和导出也应使用同样隔离规则,防止正文安全但旁路泄露。
版本和重复请求避免意外覆盖
两人同时修改草案,若最后一次保存无条件覆盖,前一个修改可能丢失。简单设计可以让保存请求带当前版本,只有与数据库版本一致才接受更新,否则提示先重新读取并比较。重复请求还可能生成两份相同记录,可以给同一次保存一个唯一请求标识,服务端识别后返回已处理结果。这些机制不是为了复杂而复杂,而是处理存储边界真实存在的冲突和重复。草案与已确认记录也要区分状态,不能把生成内容自动当成批准结果。
最少保存与安全维护
学习应用只保存必要的虚构活动字段,生产设计还要说明保留期限、删除入口、备份和权限变更后的处理。真实服务凭据不应放在网页、日志或聊天内容里,服务端使用受控配置管理,本课不提供任何真实密钥。测试包括甲能读自己的草案、乙不能读甲的草案、只读角色不能修改、旧版本保存被拒绝和同请求不重复写入。存储可靠性不只是数据有没有落盘,更包括归属正确、状态清楚、冲突可见和权限始终有效。
本节要点
- 认证确认身份,授权决定资源和动作范围
- 归属账户来自可信会话,不信任用户或模型声明
- 版本与唯一请求标识用于处理冲突和重复
动手练习:为草案保存设计授权检查
- 设虚构账户甲拥有草案一,账户乙没有共享权限
- 写读取、更新和重复保存三类请求的服务端判断
- 补充客户端把归属改成乙时的处理,并列出版本冲突提示
自查清单
- 读取和写入都依据可信身份独立授权
- 版本冲突与重复请求有明确处理
先自己做,再查看参考答案
读取草案一时,服务端先取得受信会话身份,再检查草案归属和共享规则。甲可以读取,乙在没有授权时被拒绝,不先把正文交给模型隐藏。更新还要检查写权限与当前版本,版本不一致时提示草案已变更,请重新读取并比较,不静默覆盖。客户端提交归属为乙不能直接改变归属,应按可信身份和明确转移流程处理。相同唯一请求标识的重复保存返回已处理结果,避免生成两份记录。验收同时检查正文、引用、缓存和导出,确认乙没有从其他入口得到甲的草案,生成草案状态也不自动变成已批准。