PG:身份认证
阅读前建议先了解 PG 模式概述,明确该模式与传统模式的整体差异。
本文是 PG 模式环境下身份认证的完整说明,专注介绍其内部工作机制(账号存储、JWT、数据库角色、GRANT / RLS)。通用功能(SDK 接入、登录方式管理、用户信息读写等)与传统模式一致,请参见对应通用文档。如果你使用的是传统模式,本文不适用,请阅读 身份认证概述 与其他章节。
PG 模式下,云开发身份认证 基于 PostgreSQL 构建:账号数据存储在云开发环境的 PostgreSQL 中(位于 auth schema 下),登录态通过 JWT 在请求链路中透传,并被解析到数据库会话变量里,可在 SQL、RLS 策略、列默认值中直接使用。
这种设计带来的好处——账号、表权限、行级权限统一用 SQL 表达,与业务查询同语言、同语义。具体表现为:
- 账号即是数据库表:账号不再锁在独立的身份服务里,而是落在 PostgreSQL 的
auth.users等表中,可以像业务表一样用 SQL 增删改查、JOIN、加索引、建外键,无需通过专门的身份服务 API 中转。 - 权限策略可直接读账号表:因为账号就在
auth.users表里,RLS 策略可以直接JOIN用户的角色、套餐等字段写规则,无需把这些字 段冗余到业务表,也无需在应用层先查身份服务再拼 SQL。 - 登录态 SQL 可见:当前用户 ID、角色等信息在 SQL 中可直接读取(如
auth.uid()),既能用于 RLS 策略,也能作为列默认值实现"自动写入创建者"等模式,不必在业务代码里手工传参。 - AI 友好:账号、登录态、业务数据、权限策略都以 SQL 形式存在同一个数据库里,AI 编码助手可以直接读
information_schema与pg_policies拿到真实的表结构与策略,生成的查询和 RLS 规则更贴合实际,而不是凭空猜测。
与传统模式的简单对比
身份认证对外接口(SDK / 控制台 / 登录方式 / 用户管理 / Token 管理)在两种模式下完全一致——同一份 SDK、同一个控制台入口。功能差异仅在以下维度:
| 维度 | 传统模式 | PG 模式 |
|---|---|---|
| 用户存储位置 | 中心化身份服务 | 数据库 auth.users 表(环境下的 PostgreSQL 内部,可 SQL 直查) |
| 凭证形态 | Refresh Token + Access Token | JWT(Publishable Key / API Key / Access Token,本质都是 JWT) |
| 权限模型 | 角色 + 策略(控制台 JSON DSL) | 三角色(anon / authenticated / service_role)+ GRANT + RLS |
| 用户类型 | 组织成员 / 注册用户 / 匿名用户 | 注册用户 / 匿名用户(无组织架构) |