如何将 supabase RLS 与“in”和“select”一起使用,而不必提供对联接表的不受限制的 RLS 访问

how to use supabase RLS with "in" and "select" without having to provide unrestricted RLS access to the joined tables

提问人:Nathan Tew 提问时间:10/12/2023 更新时间:10/12/2023 访问量:56

问:

我正在尝试在我的 supabase 表上设置简单的 RLS。我在所有表上启用了 RLS,然后将此策略添加到我想要从中进行选择的表中:

(project_id IN ( SELECT projects.id FROM projects))

但是,它总是失败,因为表项目也启用了 RLS。

实际上,这些策略会更加复杂,并且涉及多个表。

如何使用 RLS,而不必公开制定 RLS 策略所需的所有表?

PostgreSQL supabase 行级安全性 supabase-database

评论

0赞 Nathan Tew 10/12/2023
看来我必须使用安全定义器函数......如果我想通了,会更新

答:

0赞 Nathan Tew 10/12/2023 #1

好的,弄清楚了,事实证明这相对简单,但我会在没有指导的情况下为遇到相同问题的人发布一个答案。

解决方案是使用可以查询受 RLS 保护的表而不会受到 RLS 惩罚的表:security definer functions

https://supabase.com/docs/guides/database/postgres/row-level-security#use-security-definer-functions

https://supabase.com/docs/guides/auth/row-level-security#using-security-definer-functions

您可以创建新的架构,并使用 SQL 编辑器或 GUI 添加所需的函数。该函数可以接受参数,如 postgres 文档中所示,该文档还解释了其他一些选项:private

https://www.postgresql.org/docs/current/sql-createfunction.html