Files
medical-mall/docs/ops/2026-02-05__auth__fix-login-registration-sync.md
2026-02-05 10:11:09 +08:00

74 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 操作文档:修复登录注册与数据同步全链路问题
- **日期**: 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)
1. **修复 `ak_users` 表结构约束**:
- **文件**: `docs/sql/10_schema/user/ak_users_constraints_fix_v1.sql`
- **内容**: 移除了 `username``email``NOT NULL` 约束,以确保自动同步不会因缺少值而失败。
2. **修复 `handle_new_user` 触发器函数**:
- **文件**: `docs/sql/30_rpc/auth/handle_new_user_v3.sql`
- **内容**: 将函数逻辑修正为正确地向 `public.ak_users``INSERT` 新用户记录,并兼容写入 `public.user_roles`
3. **创建 `get_current_user_role` 函数**:
- **文件**: `docs/sql/30_rpc/auth/get_current_user_role_v1.sql`
- **内容**: 创建了用于 RPC 鉴权的权威函数,通过 `auth_id` 查询 `ak_users` 表获取角色。
### 前端侧
1. **修复 `ensureUserProfile` 写入逻辑**:
- **文件**: `utils/sapi.uts`
- **内容**: 修正了 `INSERT` 逻辑,确保写入的是 `auth_id` 而不是业务主键 `id`,并设置了默认角色。
2. **修复登录逻辑**:
- **文件**: `pages/user/login.uvue`
- **内容**: 移除了生产环境下的 `admin/admin` 本地绕过登录,强制所有登录走 Supabase Auth 以获取有效 Token。并在登录成功后调用 `ensureUserProfile`
3. **实现统一页面守卫**:
- **文件**: `layouts/admin/AdminLayout.uvue`
- **内容**: 在布局的 `onMounted` 钩子中加入了统一的权限守卫,覆盖所有使用该布局的 Admin 页面。
## 最终解决方案与验证流程
1. **数据库部署**: 按顺序执行以下权威 SQL 文件:
- `docs/sql/10_schema/user/ak_users_constraints_fix_v1.sql`
- `docs/sql/30_rpc/auth/get_current_user_role_v1.sql`
- `docs/sql/30_rpc/auth/handle_new_user_v3.sql`
- `ALTER TABLE auth.users ENABLE TRIGGER on_auth_user_created;` (确保触发器是启用的)
2. **新用户注册**: 在 App 中注册一个全新的用户。
3. **验证数据同步**: 在 SQL Editor 中执行“三表一致性”查询,确认新用户的 `status``OK` 或至少 `ak_users` 不再 `MISSING`
4. **提升权限**: 手动将新用户在 `public.ak_users` 表中的 `role` 字段更新为 `'admin'`
5. **登录并访问**: 使用新注册并已提权的账号登录 App访问 Admin 后台的统计页面,确认数据能正常加载。
## 关联文档
- `docs/AGENT_PROJECT_SPEC.md`
- `docs/sql/11_roles_and_permissions_strategy.md`