Supabase 报错“RLS Disabled in Public”的含义

232 阅读2分钟

Supabase 报错“RLS Disabled in Public”意思是你在 public 这个公开 schema 下的表(比如你的 public.spider_news_records 表)没有启用行级安全(Row Level Security,简称 RLS)。这会导致通过 Supabase 的 API,任何知道你项目 URL 的人都能对该表进行增删改查操作(CRUD),这是一个严重的安全隐患1

这个报错的含义

  • public schema 默认是对外暴露的,Supabase 的 PostgREST API 会自动暴露这个 schema 下的表。
  • 如果没有启用 RLS,任何持有项目 URL 和匿名密钥(anon key)的人,都可以访问和修改这些表的数据。
  • 这意味着数据可能被未授权访问或篡改,极其不安全21

什么时候可以不启用 RLS?

  • 如果你完全不在客户端(浏览器端)暴露 anon key,只在服务器端使用 Supabase 的服务密钥(service key)连接数据库,且不通过 Supabase API 直接暴露数据库,那么理论上可以关闭 RLS,但这需要确保没有任何客户端能访问到数据库的匿名访问权限23
  • 但官方强烈建议在 public schema 的表上启用 RLS 来保障安全4

如何解决这个问题?

  1. 启用 RLS:
    在你的数据库中执行 SQL 命令启用行级安全,例如:

    sql
    ALTER TABLE public.spider_news_records ENABLE ROW LEVEL SECURITY;
    
  2. 创建 RLS 策略(Policies):
    启用 RLS 后,默认任何通过 anon 角色的访问都会被阻止,除非你创建了相应的访问策略。例如,允许认证用户访问:

    sql
    CREATE POLICY "Allow authenticated users to select"
    ON public.spider_news_records
    FOR SELECT
    TO authenticated
    USING (true);
    

    你可以根据业务需求编写更复杂的策略,限制不同用户访问不同数据54

  3. 如果不想使用 RLS:

    • 关闭 Supabase 的公共数据库 API(在项目设置中关闭 PostgREST API)。

    • 将敏感数据放到非公开的 schema。

    • 收回 anonauthenticated 角色对表的权限:

      sql
      REVOKE ALL ON TABLE public.spider_news_records FROM anon, authenticated;
      

    这样可以避免通过公开 API 访问数据,但不推荐这种方式,除非你完全控制访问路径6

总结

  • 报错提示你表在 public schema 下没有启用 RLS,存在安全风险。
  • 推荐启用 RLS 并编写合适的访问策略,确保只有授权用户能访问数据。
  • 如果你只在服务器端使用服务密钥访问数据库,不暴露 anon key,理论上可以不启用 RLS,但这需要谨慎管理密钥和访问权限2341

这样做能有效防止数据被未授权访问,保障你的 Supabase 项目安全。