Supabase 报错“RLS Disabled in Public”意思是你在 public 这个公开 schema 下的表(比如你的 public.spider_news_records 表)没有启用行级安全(Row Level Security,简称 RLS)。这会导致通过 Supabase 的 API,任何知道你项目 URL 的人都能对该表进行增删改查操作(CRUD),这是一个严重的安全隐患1。
这个报错的含义
publicschema 默认是对外暴露的,Supabase 的 PostgREST API 会自动暴露这个 schema 下的表。- 如果没有启用 RLS,任何持有项目 URL 和匿名密钥(anon key)的人,都可以访问和修改这些表的数据。
- 这意味着数据可能被未授权访问或篡改,极其不安全21。
什么时候可以不启用 RLS?
- 如果你完全不在客户端(浏览器端)暴露
anon key,只在服务器端使用 Supabase 的服务密钥(service key)连接数据库,且不通过 Supabase API 直接暴露数据库,那么理论上可以关闭 RLS,但这需要确保没有任何客户端能访问到数据库的匿名访问权限23。 - 但官方强烈建议在
publicschema 的表上启用 RLS 来保障安全4。
如何解决这个问题?
-
启用 RLS:
在你的数据库中执行 SQL 命令启用行级安全,例如:sql ALTER TABLE public.spider_news_records ENABLE ROW LEVEL SECURITY; -
创建 RLS 策略(Policies):
启用 RLS 后,默认任何通过anon角色的访问都会被阻止,除非你创建了相应的访问策略。例如,允许认证用户访问:sql CREATE POLICY "Allow authenticated users to select" ON public.spider_news_records FOR SELECT TO authenticated USING (true); -
如果不想使用 RLS:
-
关闭 Supabase 的公共数据库 API(在项目设置中关闭 PostgREST API)。
-
将敏感数据放到非公开的 schema。
-
收回
anon和authenticated角色对表的权限:sql REVOKE ALL ON TABLE public.spider_news_records FROM anon, authenticated;
这样可以避免通过公开 API 访问数据,但不推荐这种方式,除非你完全控制访问路径6。
-
总结
- 报错提示你表在
publicschema 下没有启用 RLS,存在安全风险。 - 推荐启用 RLS 并编写合适的访问策略,确保只有授权用户能访问数据。
- 如果你只在服务器端使用服务密钥访问数据库,不暴露
anonkey,理论上可以不启用 RLS,但这需要谨慎管理密钥和访问权限2341。
这样做能有效防止数据被未授权访问,保障你的 Supabase 项目安全。