ARTICLE · 979302
AI 软件开发实战教程(十六):删除账号不是删除一行数据

系列第 16 篇:把立即停用、24 小时敏感数据擦除、90 天业务匿名化和 180 天审计删除变成可重复验证的时间契约。
一个用户的微信号不只存在个人资料里。发生联系方式交换后,双方当时的微信号还会以加密快照存在交换记录中。直接删除用户行会被大量业务外键阻止,也会破坏已经发生的候选和配对事实。
K8 把“删除账号”拆成不同时间层次。
1. 提交后立即发生什么
删除申请在一个事务中:
写入最小审计
→ 账号状态改为删除中
→ is_active 设为 false
→ 记录申请时间
→ 退出当前会话
从这一刻起,用户不能登录、发布或发起新的联系方式披露。即使 24 小时擦除任务尚未运行,权限已经停止。
审计只保存动作、内部对象类型与编号、操作者和时间,没有自由 JSON payload。结构上不给调用者顺手塞入微信号、喵码或完整请求体的入口。
2. 24 小时要找到敏感值的所有副本
保留任务会清空:
个人资料中的加密微信号; 加密喵码和验证状态; 用户作为司机时的微信号交换快照; 用户作为乘客时的微信号交换快照。
测试先完成一次真实交换,再删除司机账号。24 小时后断言司机资料和司机快照为空,同时乘客快照仍然存在。
这种定向擦除很重要。把整条交换记录删除,会连带破坏另一位仍在使用产品的成员数据;什么都不处理,又违反已经承诺的敏感数据期限。
擦除后的历史页面不会尝试解密空密文,而是显示“该用户联系方式已删除”。
3. 90 天保留业务关系,但移除身份
候选、配对和出行记录可能仍用于受控试用统计、争议排查和产品分析。首版采用 90 天匿名化:
登录账号 → deleted-内部编号-不可读后缀
邮箱和姓名 → 空
密码 → 不可用
业务外键 → 保留到匿名主体
这样数据库关系仍然完整,但不能通过原登录账号继续追踪本人。
180 天后,最小安全审计也会删除。任务使用时间条件且可以重复运行,多次执行不会重新生成已经擦除的数据。
4. 页面必须在删除前讲清后果
设置页明确展示三个期限。用户确认后看到不包含社区资料的通用页面,并已经退出登录。
移动 Chromium 旅程执行:注册、设置资料、退出、重新登录、提交删除、看到处理说明,再访问大厅被重定向到登录页。这验证的不只是服务函数,还包括会话和页面路径。
5. 管理员也不应该默认看见秘密
社区管理员可以维护邀请码摘要、地点与别名、路线兼容版本、账户状态并使用 Django 的密码重置能力。
普通 Admin 不注册私密资料、联系方式交换快照和审计记录。管理权限不能成为绕过产品隐私边界的万能入口。
6. 本节点结果
116 个非浏览器测试通过,1 个 PostgreSQL 专属测试跳过; 分支覆盖率 87.84%; 静态、类型、迁移和 Django 检查通过; 4 条 Chromium 旅程通过; 立即停用、24 小时擦除、90 天匿名化和 180 天审计删除都有冻结时钟证据; 真实备份轮换和外部隐私法律审查尚未完成,不能宣称完整合规; 结果只形成本地提交,不推送。
下一篇进入 K9:把此前每个节点的局部浏览器测试合并成完整移动验收,检查键盘、缩放、横屏、减少动态效果、敏感信息和 Gate B 微信真机准备材料。
7. 关键代码与操作
下面的简化测试把时间推进到 24 小时,分别检查被删除用户和另一位参与者的快照:
deftest_retention_wipes_only_deleted_users_sensitive_values(driver, passenger, exchange):
requested_at = timezone.now()
request_account_deletion(user_id=driver.pk, now=requested_at)
run_retention(now=requested_at + timedelta(hours=24))
driver.private_profile.refresh_from_db()
exchange.refresh_from_db()
assert driver.private_profile.encrypted_wechat_id == ""
assert exchange.encrypted_driver_wechat_id == ""
assert exchange.encrypted_passenger_wechat_id != ""
验证命令:make bugfix TEST=tests/accounts/test_deletion.py::test_retention_wipes_profile_and_exchange_snapshot_after_24_hours
断言另一位成员的快照仍然存在,可以防止清理任务误删整条共享业务记录。
8. 本篇验证摘要
删除申请提交后立即停用账号和现有会话,先停止新的访问与披露; 24 小时后定向擦除个人资料和交换快照中的敏感值; 90 天后匿名化身份但保留必要业务关系,180 天后删除最小审计; 保留任务按时间条件幂等执行,不会重新生成已经擦除的数据; 自动测试验证了时间边界,真实备份轮换和外部隐私法律审查仍未完成。
9. 附录:相关工具与仓库
9.1 gstack
仓库:garrytan/gstack 地址:https://github.com/garrytan/gstack
9.2 dev-harness
仓库:Dev-Wiki/dev-harness 地址:https://github.com/Dev-Wiki/dev-harness
9.3 UI UX Pro Max Skill
仓库:nextlevelbuilder/ui-ux-pro-max-skill 地址:https://github.com/nextlevelbuilder/ui-ux-pro-max-skill