内容提要
Realtime 服务器现已增强安全性,支持 PostgreSQL 行级安全(RLS)政策。数据库更改仅向经过身份验证的用户广播,确保每个用户的可见性检查。这一更新提升了安全性和性能,适用于所有 Supabase 项目。
延伸解读
从广播所有到按需可见:Realtime 安全模型的根本转变
此前 Realtime 将所有数据库变更广播给所有客户端,因此只能作为可选功能且长期处于 Beta。现在它尊重 PostgreSQL 行级安全策略,只向通过可见性检查的已认证用户推送变更。这意味着开发者无需在客户端或服务端额外编写过滤逻辑,安全规则在数据库层定义一次即可全局生效,降低了因广播泄露数据的风险。
WALRUS 如何实现逐用户可见性检查
WALRUS 是 Realtime 上游的安全组件,它接收逻辑复制流中的每条变更,识别源表、操作类型,并查询订阅表找出当前订阅该表的用户。随后以每个订阅者身份查询源表,判断该记录是否对其可见,最后将授权用户列表返回给 Realtime 服务器。这一过程在数据库内完成,避免了外部进程轮询带来的网络延迟和 I/O 开销。
性能随订阅者增长:数据与优化方向
文章给出的处理时间数据显示,订阅者从 1 人增至 10,000 人时,单条记录处理时间从约 11 毫秒升至约 304 毫秒。为控制开销,WALRUS 使用主键进行访问检查,并将查询包装为预备语句以跳过查询规划阶段。开发者应避免在策略中使用连接、确保过滤条件走索引,并尽量使用小型定长主键,以降低每条变更的检查成本。
实践建议:何时不该启用 RLS
对于公开或非敏感数据(如公开股价),文章建议不要启用行级安全,因为最快的策略就是没有策略。若必须启用,应优化策略本身,因为策略会在每次查询触及该表时执行,慢策略会拖慢所有访问。此外,策略中的连接会连带执行被连接表的 RLS 策略,进一步增加开销,因此应尽量避免。
Q&A
Supabase 的 Realtime 服务器如何增强安全性?
Supabase 的 Realtime 服务器通过支持 PostgreSQL 行级安全(RLS)政策来增强安全性,确保数据库更改仅向经过身份验证的用户广播。
什么是 PostgreSQL 行级安全(RLS)政策?
PostgreSQL 行级安全(RLS)政策允许用户控制对数据表中单独行的访问,用户可以创建、读取、更新或删除特定行。
如何优化 Supabase 中的 RLS 性能?
优化 Supabase 中的 RLS 性能的最佳实践包括禁用公共表的 RLS、确保安全策略快速执行,以及使用小型主键。
WALRUS 功能在 Realtime 中的作用是什么?
WALRUS 功能用于检查每个记录的可见性,确保在数据库更改时,只有授权的用户能够查看相关记录。
Supabase 的 Realtime RLS 更新适用于哪些项目?
Supabase 的 Realtime RLS 更新适用于所有现有和新创建的 Supabase 项目。
在使用 RLS 时,如何处理查询性能瓶颈?
为了解决查询性能瓶颈,Realtime 服务器通过使用主键进行访问检查,并减少网络延迟和 I/O 瓶颈来提高性能。