该技能用于指导编写生产可用的 Supabase PostgreSQL 行级安全(RLS)策略,适用于创建、修改或排查 RLS 策略的场景。
主要能力:给出策略基本结构,CREATE POLICY 包含 FOR 操作、TO 角色、USING 与 WITH CHECK 条件;说明不同操作的条件用法——SELECT 与 DELETE 只用 USING,INSERT 只用 WITH CHECK,UPDATE 两者都用;要求为每种操作单独建策略,不用 FOR ALL。
Supabase 特性:介绍 anon(未登录)与 authenticated(已登录)两个内置角色,TO 子句须放在 FOR 之后;辅助函数 auth.uid() 返回请求用户 ID,auth.jwt() 可读取 raw_user_meta_data(用户可改,不宜用于授权)与 raw_app_meta_data(用于授权)。可用 AAL 检查多因素认证,如 (SELECT auth.jwt()->>'aal') = 'aal2'。
性能优化:建议为策略涉及的列建索引,如 CREATE INDEX userid ON test_table USING btree (user_id);将函数包在 SELECT 中以利用缓存,如 (SELECT auth.uid()) = user_id;尽量减少连接,改用集合查询;始终用 TO 指定角色。
语法规则:字符串中使用双撇号转义;PostgreSQL 不支持一条策略包含多个操作。
常见模式:基于所有者的访问、基于团队的访问、公开读+认证写。策略类型默认 PERMISSIVE(OR 组合),RESTRICTIVE 需全部通过(AND),后者应少用。输出 SQL 放代码块,策略命名用描述性双引号语句,解释与 SQL 分离。
限制:仅处理 RLS 策略相关问题,超出范围时建议改述请求或使用其他工具。