强化数据 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 端点访问您的数据库,则建议这样做。
- 公开自定义 schema 而不是
public,让您明确控制可访问的内容。 - 使用事件触发器自动在新表上启用 RLS。
- 调整表级别授权 以控制哪些角色可以访问特定表。
禁用 Data API#
如果您从不打算使用 Supabase 客户端库或 REST 和 GraphQL 数据端点,可以完全禁用 Data API。例如,如果您仅通过服务器上的直接连接访问您的数据库,禁用 Data API 可以为您提供最大的保护层。
- 转到 Supabase Dashboard 中的 API 设置。
- 在 Data API 设置下,关闭 启用 Data API 切换开关。
公开自定义 schema 而不是 public#
如果您想使用 Data API 但需要更高的安全性,可以公开自定义 schema 而不是 public。通过不使用 public,而 public 通常用作默认空间并且具有较宽松的默认权限,您可以更自觉地控制您公开的数据。
任何应该公开的数据、视图或函数都需要有意地放入您的自定义 schema(我们称之为 api),而不是默认情况下最终到达那里。
步骤 1:从公开 schema 中删除 public#
- 转到 Supabase Dashboard 中的 API 设置。
- 在 Data API 设置下,从 公开 schema 中删除
public。同时从 额外搜索路径 中删除public。 - 点击 保存。
- 转到 数据库扩展 并禁用
pg_graphql扩展。
步骤 2:创建一个 api schema 并公开它#
-
连接到您的数据库。您可以使用
psql、Supabase SQL 编辑器 或您选择的 Postgres 客户端。 -
创建一个名为
api的新 schema1create schema if not exists api; -
授予
anon和authenticated角色对该 schema 的使用权限。1grant usage on schema api to anon, authenticated; -
转到 Supabase Dashboard 中的 API 设置。
-
在 Data API 设置下,将
api添加到 公开 schema。确保它是列表中的第一个 schema,以便默认情况下首先搜索它。 -
在这些新设置下,
anon和authenticated可以执行在apischema 中定义的函数,但它们对任何表都没有自动权限。您可以逐个表地授予它们权限。例如1grant select on table api.<your_table> to anon;2grant select, insert, update, delete on table api.<your_table> to authenticated;
自动在新表上启用 RLS#
通过 Supabase Dashboard 创建的表默认启用 RLS。但是,如果您或您的团队使用 SQL 编辑器、迁移或外部工具创建表,则 RLS 将不会自动启用。
您可以使用 事件触发器,以便每当在 public schema 中创建新表时自动启用 RLS。这可确保没有表意外地在没有 RLS 保护的情况下暴露。
表级别授权#
默认情况下,public schema 中的表授予 anon 和 authenticated 角色完全访问权限(SELECT、INSERT、UPDATE、DELETE)。这允许 Data API 代表用户查询这些表。
您可以调整这些权限,以限制每个角色可以执行的操作。例如,您可能希望
- 允许
anon用户仅从表中SELECT,防止匿名写入。 - 防止
anon用户访问表,使其仅对经过身份验证的用户可用。 - 限制
authenticated用户仅SELECT和INSERT,防止更新和删除。
表级别权限与 行级别安全性 协同工作。权限控制哪些操作是可能的,而 RLS 策略控制哪些行可访问。为了获得完全保护,请同时使用两者:限制权限以限制操作类型,并使用 RLS 策略来控制行级别访问。
通过 Dashboard 调整表级别授权#
通过 Dashboard 调整表级别权限目前处于 Beta 测试阶段,并将通过逐步推广的方式提供。
- 转到 Supabase Dashboard 中的 表编辑器。
- 选择您要配置的表。
- 单击垂直省略号图标以打开表菜单,然后选择“编辑表”。
- 在 Data API 访问下,单击设置图标以打开 调整每个角色的 API 权限。
- 对于每个角色(
anon和authenticated),选择或取消选择您要授予的权限。 - 点击 保存。
通过 SQL 调整表级别授权#
您还可以使用 SQL 调整权限。例如,要仅允许 anon 对表进行 SELECT 访问
1-- Revoke all existing privileges2revoke all on table public.your_table from anon;34-- Grant only SELECT5grant select on table public.your_table to anon;要删除 anon 对表的全部访问权限
1revoke all on table public.your_table from anon;要恢复完全访问权限
1grant select, insert, update, delete on table public.your_table to anon;