# 角色与权限策略(权威口径) > 本文档为 `docs/sql/` 权威 SQL 入库与评审的安全口径说明。任何涉及 RLS / RPC / GRANT 的变更,必须对照本文档与 `docs/project_spec/AGENT_PROJECT_SPEC.md`。 ## 1. 权威身份字段 - 后台/分析端角色字段唯一权威:`public.ak_users.role` - 推荐值:`admin` / `analytics` / `user`(以及业务需要的扩展值) ## 2. 权限访问基本原则 ### 2.1 最小权限原则 - 默认不对 `anon` / `authenticated` 开放管理侧敏感表的直接访问。 - 管理侧的“全局读写”必须通过 RPC(函数)进行封装。 ### 2.2 RLS 先行 - 所有业务表必须开启 RLS(除非明确说明原因)。 - 对消费者端可公开读取的数据(如提货点),允许创建只读 SELECT policy,并限制条件(例如 `status = 1`)。 ## 3. RPC 安全口径(强制) ### 3.1 SECURITY DEFINER 所有管理端 RPC 必须: - `SECURITY DEFINER` - `SET search_path = public` - 入口鉴权:必须校验当前用户为后台管理员 推荐的入口鉴权形式: - 通过 `public.ak_users` 校验: - `WHERE auth_id = auth.uid() AND role = 'admin'` > 注:如未来引入统一函数 `get_current_user_role()`,则可改为 `get_current_user_role() IN ('admin','analytics')`。 ### 3.2 返回字段最小化 - 仅返回前端所需字段。 - 禁止返回敏感字段(如密钥、token、完整手机号/身份证号等),除非有明确业务需求与脱敏方案。 ### 3.3 分页与限制 - 列表类 RPC 必须支持分页(`LIMIT/OFFSET`)或带 `LIMIT`。 ## 4. GRANT/REVOKE 口径 - 默认:`REVOKE ALL ... FROM PUBLIC`。 - 仅对需要调用 RPC 的角色授予 `EXECUTE`(通常为 `authenticated`)。 - 禁止对 `anon/authenticated` 大范围 `GRANT` 直接表权限。 ## 5. 入库评审要点(与 AGENT_PROJECT_SPEC.md 对齐) 评审必须覆盖: - 是否开启 RLS;policy 是否过宽。 - 是否存在不安全的 `SECURITY DEFINER`(无鉴权/未固定 search_path)。 - 是否有破坏性语句(DROP/TRUNCATE/无 WHERE 的 UPDATE/DELETE)。 --- ## 6. 关联文档 - `docs/project_spec/AGENT_PROJECT_SPEC.md` - `docs/sql/00_meta/README.md`