4.0 KiB
4.0 KiB
操作文档:修复登录注册与数据同步全链路问题
- 日期: 2026-02-05
- 范围: 用户认证、注册、数据库同步及页面守卫
- 标题: 修复因“写入协调”失败导致的 Admin 功能权限问题
摘要
本操作彻底解决了新用户注册后,因数据库写入协调失败,导致业务用户表 (public.ak_users) 记录缺失,进而使得所有需要 admin/analytics 角色的 RPC 调用和页面访问全部失败的问题。修复遵循 @docs/AGENT_PROJECT_SPEC.md 规范,涉及数据库 DDL、触发器函数、前端服务和页面守卫的全链路调整。
动机
- 直接问题: Admin 后台的统计图表始终显示为 0,即使在数据库中有数据。
- 根本原因: 前端 RPC 调用因权限不足被拒绝。
- 深层原因: 权限检查依赖的
get_current_user_role()函数因在ak_users表中找不到当前用户的auth_id而返回NULL。 - 最终根源: 新用户在
auth.users表注册后,自动同步到ak_users表的数据库触发器handle_new_user()函数逻辑错误(未向ak_users写入),导致数据不一致。
影响范围
- 数据库:
public.ak_users表结构,public.handle_new_user()函数,auth.users表上的on_auth_user_created触发器。 - 前端服务:
utils/sapi.uts(ensureUserProfile),utils/store.uts(getCurrentUser),services/analytics/authGuard.uts. - 前端页面:
pages/user/login.uvue,pages/user/register.uvue,layouts/admin/AdminLayout.uvue.
变更清单
数据库侧 (权威 SQL)
-
修复
ak_users表结构约束:- 文件:
docs/sql/10_schema/user/ak_users_constraints_fix_v1.sql - 内容: 移除了
username和email的NOT NULL约束,以确保自动同步不会因缺少值而失败。
- 文件:
-
修复
handle_new_user触发器函数:- 文件:
docs/sql/30_rpc/auth/handle_new_user_v3.sql - 内容: 将函数逻辑修正为正确地向
public.ak_users表INSERT新用户记录,并兼容写入public.user_roles。
- 文件:
-
创建
get_current_user_role函数:- 文件:
docs/sql/30_rpc/auth/get_current_user_role_v1.sql - 内容: 创建了用于 RPC 鉴权的权威函数,通过
auth_id查询ak_users表获取角色。
- 文件:
前端侧
-
修复
ensureUserProfile写入逻辑:- 文件:
utils/sapi.uts - 内容: 修正了
INSERT逻辑,确保写入的是auth_id而不是业务主键id,并设置了默认角色。
- 文件:
-
修复登录逻辑:
- 文件:
pages/user/login.uvue - 内容: 移除了生产环境下的
admin/admin本地绕过登录,强制所有登录走 Supabase Auth 以获取有效 Token。并在登录成功后调用ensureUserProfile。
- 文件:
-
实现统一页面守卫:
- 文件:
layouts/admin/AdminLayout.uvue - 内容: 在布局的
onMounted钩子中加入了统一的权限守卫,覆盖所有使用该布局的 Admin 页面。
- 文件:
最终解决方案与验证流程
-
数据库部署: 按顺序执行以下权威 SQL 文件:
docs/sql/10_schema/user/ak_users_constraints_fix_v1.sqldocs/sql/30_rpc/auth/get_current_user_role_v1.sqldocs/sql/30_rpc/auth/handle_new_user_v3.sqlALTER TABLE auth.users ENABLE TRIGGER on_auth_user_created;(确保触发器是启用的)
-
新用户注册: 在 App 中注册一个全新的用户。
-
验证数据同步: 在 SQL Editor 中执行“三表一致性”查询,确认新用户的
status为OK或至少ak_users不再MISSING。 -
提升权限: 手动将新用户在
public.ak_users表中的role字段更新为'admin'。 -
登录并访问: 使用新注册并已提权的账号登录 App,访问 Admin 后台的统计页面,确认数据能正常加载。
关联文档
docs/AGENT_PROJECT_SPEC.mddocs/sql/11_roles_and_permissions_strategy.md