数据库

强化数据 API


您的数据库自动生成的 Data API 默认公开 public schema。您可以将其更改为数据库中的任何 schema,甚至完全禁用 Data API。

通过 Data API 可访问的任何表必须启用 行级别安全性。行级别安全性 (RLS) 在您从 Supabase Dashboard 创建表时默认启用。如果您使用 SQL 编辑器或您自己的 SQL 客户端或迁移运行器创建表,则必须自行启用 RLS。

共同责任#

您的应用程序的安全性是作为开发人员您的责任。这包括 RLS,属于 共同责任模型。为了帮助您

  • Supabase 会发送每日电子邮件,警告任何暴露给 Data API 且未启用 RLS 的表。
  • Supabase 提供了安全顾问和 Supabase Dashboard 中的其他工具来修复任何问题。

私有 schema#

我们强烈建议创建一个 private schema 来存储您不想通过 Data API 公开的表。这些表可以通过 Supabase Edge Functions 或任何其他服务器端工具访问。在这种模式下,您应该在服务器端代码中实现您的安全模型。虽然不是必需的,但我们仍然建议为私有表启用 RLS,然后使用具有 bypassrls 权限的 Postgres 角色连接到您的数据库。

管理 public schema#

如果您的 public schema 被其他工具用作默认空间,您可能希望锁定此 schema。这有助于防止意外暴露自动添加到 public 的数据。

Data API 有几个级别的安全强化

禁用 Data API#

如果您从不打算使用 Supabase 客户端库或 REST 和 GraphQL 数据端点,可以完全禁用 Data API。例如,如果您仅通过服务器上的直接连接访问您的数据库,禁用 Data API 可以为您提供最大的保护层。

  1. 转到 Supabase Dashboard 中的 API 设置
  2. Data API 设置下,关闭 启用 Data API 切换开关。

公开自定义 schema 而不是 public#

如果您想使用 Data API 但需要更高的安全性,可以公开自定义 schema 而不是 public。通过不使用 public,而 public 通常用作默认空间并且具有较宽松的默认权限,您可以更自觉地控制您公开的数据。

任何应该公开的数据、视图或函数都需要有意地放入您的自定义 schema(我们称之为 api),而不是默认情况下最终到达那里。

步骤 1:从公开 schema 中删除 public#

  1. 转到 Supabase Dashboard 中的 API 设置
  2. Data API 设置下,从 公开 schema 中删除 public。同时从 额外搜索路径 中删除 public
  3. 点击 保存
  4. 转到 数据库扩展 并禁用 pg_graphql 扩展。

步骤 2:创建一个 api schema 并公开它#

  1. 连接到您的数据库。您可以使用 psqlSupabase SQL 编辑器 或您选择的 Postgres 客户端。

  2. 创建一个名为 api 的新 schema

    1
    create schema if not exists api;
  3. 授予 anonauthenticated 角色对该 schema 的使用权限。

    1
    grant usage on schema api to anon, authenticated;
  4. 转到 Supabase Dashboard 中的 API 设置

  5. Data API 设置下,将 api 添加到 公开 schema。确保它是列表中的第一个 schema,以便默认情况下首先搜索它。

  6. 在这些新设置下,anonauthenticated 可以执行在 api schema 中定义的函数,但它们对任何表都没有自动权限。您可以逐个表地授予它们权限。例如

    1
    grant select on table api.<your_table> to anon;
    2
    grant select, insert, update, delete on table api.<your_table> to authenticated;

自动在新表上启用 RLS#

通过 Supabase Dashboard 创建的表默认启用 RLS。但是,如果您或您的团队使用 SQL 编辑器、迁移或外部工具创建表,则 RLS 将不会自动启用。

您可以使用 事件触发器,以便每当在 public schema 中创建新表时自动启用 RLS。这可确保没有表意外地在没有 RLS 保护的情况下暴露。

表级别授权#

默认情况下,public schema 中的表授予 anonauthenticated 角色完全访问权限(SELECTINSERTUPDATEDELETE)。这允许 Data API 代表用户查询这些表。

您可以调整这些权限,以限制每个角色可以执行的操作。例如,您可能希望

  • 允许 anon 用户仅从表中 SELECT,防止匿名写入。
  • 防止 anon 用户访问表,使其仅对经过身份验证的用户可用。
  • 限制 authenticated 用户仅 SELECTINSERT,防止更新和删除。

通过 Dashboard 调整表级别授权#

  1. 转到 Supabase Dashboard 中的 表编辑器
  2. 选择您要配置的表。
  3. 单击垂直省略号图标以打开表菜单,然后选择“编辑表”。
  4. Data API 访问下,单击设置图标以打开 调整每个角色的 API 权限
  5. 对于每个角色(anonauthenticated),选择或取消选择您要授予的权限。
  6. 点击 保存

通过 SQL 调整表级别授权#

您还可以使用 SQL 调整权限。例如,要仅允许 anon 对表进行 SELECT 访问

1
-- Revoke all existing privileges
2
revoke all on table public.your_table from anon;
3
4
-- Grant only SELECT
5
grant select on table public.your_table to anon;

要删除 anon 对表的全部访问权限

1
revoke all on table public.your_table from anon;

要恢复完全访问权限

1
grant select, insert, update, delete on table public.your_table to anon;