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