基于关系 table 数据的行级安全性

Row-level-security based on relation table data

我正在学习 Supabase 并且为了练习,我正在 制作一个 suuuper 简化的网站构建器
但是我在行级安全策略方面遇到了麻烦。

我有三个table:

user
user_id
...
website
website_id
...
user_website
user_id
website_id
user_role
...

我没有找到任何有用的资源,因为老实说我仍然缺乏知道如何正确搜索我需要的东西的知识。

我只找到像 (uid() = user_id) 这样的简单表达式,但由于“权限”存储在另一个 table 中,我不知道如何访问它。

我使用了如下查询,但没有按预期工作:

SELECT
  *
FROM
  user_website as uw
  JOIN website as w
  ON uw.website_id = w.website_id
WHERE
  uw.user_id = auth.uid()

非常感谢您的帮助 - 谢谢!

您可以定义这样的策略:

CREATE POLICY may_edit ON website
   FOR UPDATE TO PUBLIC
   USING (EXISTS
             (SELECT 1 FROM user_website
              WHERE user_website.website_id = website.website_id
              AND user_website.user_id = uid()
             )
         );

这里,uid()是returns你当前用户ID的函数。

这个政策会让大家修改自己的网站。

我打电话给一个朋友寻求帮助,他指出了一个 section in the Supabase docs about "policies with joins" ......但它仍然对我不起作用。

原因是 table 网站上的 RLS 政策引用了 table 用户网站 ,它还不允许用户访问任何内容。

解决方案

网站上 select 的 RLS 政策:

auth.uid() in (
  select user_id from user_website
  where website_id = website.website_id
)

用户网站 select 的 RLS 政策:

auth.uid() = user_id