0

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

我有三张桌子:

  • 用户→ 包含用户的名字、姓氏等信息。
  • 网站→ 所有网站
  • user_website → 包含哪个网站属于哪个人的信息(因为一个网站可以由多个用户拥有/编辑)
用户
用户身份
...
网站
website_id
...
用户网站
用户身份
website_id
用户角色
...

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

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

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

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

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

4

2 回答 2

1

您可以定义这样的策略:

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()是一个返回当前用户 ID 的函数。

该政策将允许每个人修改自己的网站。

于 2021-11-19T13:07:13.967 回答
0

我打电话给一个朋友寻求帮助,他指出了Supabase 文档中关于“连接策略”的部分......但它仍然对我不起作用。

原因是表 website 上的 RLS-policy 引用了表 user-website,它不允许用户访问任何内容。

解决方案

在网站上选择的 RLS 政策:

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

在用户网站上选择的 RLS 策略:

auth.uid() = user_id
于 2021-11-19T13:44:20.567 回答