specsfy-specialist-supabase
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSupabase
Supabase
Quando usar
适用场景
- Acionar quando o projeto tem , migrations em
supabase/config.toml, ou clientessupabase/migrations/e a tarefa envolve RLS, Auth, Storage, Realtime, Edge Functions ou ambiente local Supabase (@supabase/supabase-js).supabase start - Acionar também para revisão de política de acesso, policy RLS ausente ou
incorreta, ou exposição indevida de .
service_role - Não acionar para tuning puro de índice/plano/isolation do Postgres
subjacente sem o contexto Supabase — usar e trazer o resultado de volta para as policies.
$specsfy-specialist-postgres - Combinar com quando a revisão envolver JWT, claims customizadas ou superfícies de autorização fora do banco.
$specsfy-specialist-application-security
- 当项目包含、
supabase/config.toml下的迁移文件,或supabase/migrations/客户端,且任务涉及RLS、Auth、Storage、Realtime、Edge Functions或Supabase本地环境(@supabase/supabase-js)时触发。supabase start - 当需要审查访问策略、缺失或错误的RLS policy,或不当暴露时也可触发。
service_role - 若仅针对底层Postgres进行索引/执行计划/隔离级别调优且无Supabase上下文,请勿触发此类任务——应使用,并将结果应用到相关policies中。
$specsfy-specialist-postgres - 当审查涉及JWT、自定义claims或数据库外的授权面时,需结合。
$specsfy-specialist-application-security
Fluxo
流程
- Identificar SDK usado (,
@supabase/supabase-js, framework específico), projeto, schemas expostos via API, migrations existentes e estratégia de ambientes (local, preview, produção).ssr - Mapear identidades, tenants, papéis (,
anon, papéis customizados) e a origem de cada claim usada em decisão de acesso (authenticated,auth.uid(), metadata).auth.jwt() - Modelar tabelas, funções e views no Postgres primeiro — a API REST/ GraphQL e os tipos gerados são derivados do schema, não o contrário.
- Definir privilégios () para o objeto e políticas RLS para cada operação (
GRANT,SELECT,INSERT,UPDATE) e papel, negando por padrão.DELETE - Implementar a migration versionada e testar com usuários representativos
de cada papel, incluindo o caso sem sessão ().
anon - Validar Auth, Storage, Realtime ou Edge Functions apenas quando o projeto de fato os usa — não configurar superfície que a aplicação não expõe.
- Verificar tipos TypeScript gerados, estratégia de pooling (session vs transaction), logs e política de backup/rollback antes de considerar pronto.
- 识别使用的SDK(、
@supabase/supabase-js、特定框架)、项目、通过API暴露的schemas、现有迁移文件及环境策略(本地、预览、生产)。ssr - 映射身份、租户、角色(、
anon、自定义角色),以及访问决策中使用的每个claim的来源(authenticated、auth.uid()、元数据)。auth.jwt() - 先在Postgres中建模表、函数和视图——REST/GraphQL API及生成的类型均派生自schema,而非反之。
- 为对象定义权限(),并为每个操作(
GRANT、SELECT、INSERT、UPDATE)和角色设置RLS policies,默认拒绝所有访问。DELETE - 实现版本化迁移,并使用各角色的代表性用户进行测试,包括无会话场景()。
anon - 仅当项目实际使用Auth、Storage、Realtime或Edge Functions时才进行配置验证——不要配置应用未暴露的访问面。
- 在确认完成前,检查生成的TypeScript类型、连接池策略(session vs transaction)、日志及备份/回滚策略。
Padrões
最佳实践
- Habilitar RLS em toda tabela de schema exposto à API e negar por padrão —
tabela com RLS desabilitada em schema público é acessível por qualquer
que descubra o nome.
anon - Nunca expor no cliente (browser, app mobile, bundle público); ela ignora RLS e só pertence a ambiente de servidor confiável.
service_role - Testar cada policy separadamente para ,
anone qualquer papel de aplicação — uma policy que "parece" restringir mas usaauthenticatedequivale a não ter policy.USING (true) - Tratar como superfície crítica: funções (rodam com privilégio do dono, não do chamador — precisam de
SECURITY DEFINERfixo e validação interna própria), claims customizadas no JWT (podem ser manipuladas se a fonte não for confiável) e buckets de Storage marcados como públicos.search_path - Versionar toda mudança de schema em migration (); edição manual no dashboard de produção diverge do histórico e quebra
supabase migration new/CI.supabase db diff - Separar autorização de produto (o que este usuário pode fazer com este registro) da mera autenticação (quem é o usuário) — RLS resolve a primeira, Auth resolve a segunda.
- Planejar conexão direta (poucas conexões persistentes, migrations),
session pool (compatibilidade ampla, funciona) ou transaction pool (alta concorrência, serverless) conforme o workload e o driver.
PREPARE
- 对所有暴露给API的schema中的表启用RLS并默认拒绝访问——公共schema中未启用RLS的表可被任何发现其名称的用户访问。
anon - 切勿在客户端(浏览器、移动应用、公开打包文件)中暴露;它会绕过RLS,仅应在可信服务器环境中使用。
service_role - 针对、
anon及任何应用角色分别测试每个policy——使用authenticated的policy等同于未设置任何policy。USING (true) - 将以下内容视为关键访问面:函数(以所有者权限而非调用者权限运行——需固定
SECURITY DEFINER并自行进行内部验证)、JWT中的自定义claims(若来源不可信则可能被篡改)、标记为公开的Storage buckets。search_path - 所有schema变更均通过迁移进行版本化();在生产仪表盘中手动编辑会偏离历史记录,导致
supabase migration new/CI失效。supabase db diff - 将产品授权(该用户可对该记录执行哪些操作)与单纯的身份验证(用户是谁)分离——RLS解决前者,Auth解决后者。
- 根据工作负载和驱动程序,规划直接连接(少量持久连接、迁移)、session pool(兼容性广、支持)或transaction pool(高并发、serverless)。
PREPARE
Antipadrões
反模式
- Policy /
USING (true)deixada "temporariamente" para destravar desenvolvimento e nunca revisada antes de produção — equivale a RLS desabilitada.WITH CHECK (true) - Checar tenant/ownership só no cliente (filtrar a query pelo no frontend) sem policy correspondente no banco — qualquer chamada direta à API contorna o filtro.
tenant_id - Função sem
SECURITY DEFINER/schema fixo — permite sequestro de função por objeto de mesmo nome em outro schema noSET search_path = ''do chamador.search_path - Migration aplicada manualmente em produção via dashboard, divergindo do
histórico versionado — o próximo /
db pushnão sabe reconciliar o estado real.db diff - Confiar em claim customizada do JWT sem validar sua origem (ex.: campo gravável pelo próprio usuário sendo usado como papel de autorização).
- 为了解锁开发而临时设置/
USING (true)的policy,且在上线前未进行审查——等同于未启用RLS。WITH CHECK (true) - 仅在客户端检查租户/所有权(在前端通过过滤查询),而未在数据库中设置对应的policy——任何直接调用API的请求均可绕过该过滤。
tenant_id - 函数未设置
SECURITY DEFINER/固定schema——允许调用者SET search_path = ''中其他schema内的同名对象劫持该函数。search_path - 通过仪表盘中手动在生产环境应用迁移,偏离版本化历史记录——下一次/
db push将无法协调实际状态。db diff - 信任JWT中的自定义claims而不验证其来源(例如:允许用户自行修改的字段被用作授权角色)。
Validação
验证步骤
- Provar acesso permitido e negado com identidades reais de teste para cada
papel, incluindo sessão ausente () e o "vizinho" de outro tenant.
anon - Executar /lint/migrations no ambiente local antes de promover — o projeto local reproduz o schema e as policies de produção.
supabase db reset - Conferir tipos gerados () atualizados, replicação/ Realtime restrita ao mesmo modelo de tenancy, policies de Storage por bucket, e segredos de Edge Functions fora do código-fonte.
supabase gen types - Avaliar recuperação e exportação dos dados além do backup gerenciado — testar um restore ou export completo, não assumir que o backup automático garante RTO aceitável.
- Não declarar uma tabela "protegida por RLS" sem o teste negativo (acesso que deveria falhar, falhando de fato).
- 使用各角色的真实测试身份验证允许和拒绝的访问情况,包括无会话场景()及其他租户的“邻接用户”。
anon - 在推广到生产环境前,在本地环境执行/lint/迁移——本地项目需复刻生产环境的schema和policies。
supabase db reset - 检查更新后的生成类型()、限制在同一租户模型内的复制/Realtime、按bucket设置的Storage policies,以及代码库之外的Edge Functions密钥。
supabase gen types - 除托管备份外,评估数据恢复和导出能力——测试完整的恢复或导出操作,不要假设自动备份能保证可接受的RTO。
- 若声明某表“受RLS保护”,必须进行否定测试(应被拒绝的访问确实被拒绝)。
Skills relacionadas
相关技能
- cobre serviços locais e imagens auxiliares; esta skill governa os contratos gerenciados da plataforma Supabase.
$specsfy-specialist-docker - para modelagem de schema, índice, plano de query e isolation por trás do Supabase.
$specsfy-specialist-postgres - para modelagem de ameaça de JWT, claims e superfícies de autorização além de RLS.
$specsfy-specialist-application-security - quando o mesmo projeto tiver um backend Laravel consumindo o mesmo Postgres além do Supabase.
$specsfy-specialist-laravel
Leia references/standards.md antes de alterar
RLS, Auth, schemas expostos, Storage, Realtime ou estratégia de conexão.
- 涵盖本地服务和辅助镜像;本技能负责Supabase平台的托管契约。
$specsfy-specialist-docker - 用于Supabase底层的schema建模、索引、查询计划和隔离级别设置。
$specsfy-specialist-postgres - 用于JWT、claims及RLS之外的授权面的威胁建模。
$specsfy-specialist-application-security - 适用于同一项目中Laravel后端除Supabase外还使用同一Postgres的场景。
$specsfy-specialist-laravel
在修改RLS、Auth、暴露的schemas、Storage、Realtime或连接策略前,请阅读references/standards.md。