10月31日,你让AI构建工具给应用加个新功能,代码生成完毕,页面却打不开。老功能一切正常,只有刚建的那张表,读也读不了,写也写不进。这不是AI写错了代码,是Supabase在2026年10月30日生效的一条规则变了:新表不再自动对应用开放,必须先拿到显式的Postgres GRANT。
用Lovable、Bolt这类AI构建工具搭在Supabase上的应用,最容易撞上这一条。浏览器直接调…supabase.co/rest/v1/,迁移脚本由AI代写,人没看过diff,表就建好了。
变的是什么
在此之前,Supabase会给publicschema里每张新表的anon、authenticated、service_role三个角色自动授予select、insert、update、delete权限。表一存在,就能通过Data API(supabase-js调用的REST/GraphQL层)访问。
现在这条默认没了。新表建出来是“哑”的,除非迁移里写明GRANT。
Supabase给出的时间线分三步:
- 2026年4月28日:项目创建时可选择启用
- 2026年5月30日:新项目默认启用
- 2026年10月30日:所有现有项目强制执行
什么不受影响
按Supabase的说法,已有表“保留当前授权,继续可访问”;行级安全(RLS)逻辑不变;storage、auth、realtime、自定义schema都不动;只用直连Postgres、不走Data API的应用也不受影响。
Supabase给出的理由值得做AI开发的人读一遍:agent、CLI脚本和AI平台现在会在没有人审diff的情况下建表,旧默认让一张表在还没加固之前就暴露出去,太容易了。
谁需要动手
Supabase明确点名两类情况:应用通过Data API(supabase-js、任意客户端库、/rest/v1/、/graphql/v1/)访问public表;或者你的迁移、AI编码工具建表时不带GRANT语句。
这基本覆盖了AI搭出来的大多数Supabase应用。至于Lovable Cloud、Bolt Database这类托管后端是否同日生效、工具是否已自动补授权,目前没有验证结论。如果你接的是自己的Supabase项目,按适用处理。
两分钟自查
症状很典型:建在新表上的功能加载不出来或存不进去,老功能正常。Supabase的排障文档提到,客户端常把它报成401或403。
打开浏览器开发者工具,切到Network,点开指向…supabase.co/rest/v1/的失败请求,缺授权的报错长这样:
- code:
- message:permission denied for table your_table
- hint:提示里直接写出该给哪个角色补哪条GRANT
别和RLS错误搞混。同样是42501,但message是“new row violates row-level security policy”的,是行级安全策略在正常拦截,不是这次变更。
Supabase控制台里,Security Advisor会标出受影响的表并附修复SQL,Table Editor会显示Data API暴露徽标。想在SQL Editor里直接看某张表的授权:
select grantee, privilege_type from information_schema.role_table_grants where table_name = 'your_table';
修法:补GRANT,RLS别关
Supabase要求把这两件事当成一个整体,写进同一个迁移:“如果授权缺失,Postgres在RLS介入之前就拒绝了查询。”
授权只给各角色真正需要的:
- grant select on public.your_table to anon——仅当未登录访客本就该读这张表
- grant select, insert, update, delete on public.your_table to authenticated
- grant select, insert, update, delete on public.your_table to service_role
然后保持行级安全开启,再补上需要的策略,例如只允许用户读自己的行。
三个坑要避开:
- 条件反射地给anon授权。除非这张表本就该公开,否则别写。
- 把授权当安全措施。Supabase文档写得很清楚:GRANT决定角色能不能碰到表,RLS决定能碰到哪些行。一张暴露在外却没开RLS的表,任何有匹配授权的角色都能访问,而anon就是你的公开密钥。
- 一次性授权整个schema。那会顺带打开所有从没开过RLS的表。
给AI工具补一句提示词
可以在Lovable、Bolt或编码agent里加一段约束:今后在Supabase public schema建新表时,把显式GRANT语句和建表、行级安全、策略写进同一个迁移;只给authenticated和service_role授予应用需要的select、insert、update、delete;只有未登录访客该读的表才给anon授select;永远不关闭行级安全,永远不一次性授权整个schema的所有表。
再让它检查报42501“permission denied for table”的那张表,补上缺失授权、保持RLS开启,并列出新增的授权和策略。改完开着Network面板刷新,确认42501消失。Supabase也建议更新AI工具的系统提示词,或使用其agent skill,让授权默认被加上。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.