【问题标题】:Row-level-security based on relation table data基于关系表数据的行级安全
【发布时间】:2021-12-30 04:06:41
【问题描述】:

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

我有三张桌子:

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

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

我只找到了像(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()

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

【问题讨论】:

    标签: postgresql row-level-security supabase


    【解决方案1】:

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

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

    解决方案

    网站选择的 RLS 政策:

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

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

    auth.uid() = user_id
    

    【讨论】:

    • 帮助我调试的是我模拟查询响应的策略版本:auth.uid() in ('2ce0b0af-baad-4a2d-83fe-c4c2ee9f2cbb','2ce0b0af-baad-4a2d-83fe-c4c2ee9f2caa')(第一个 UUID 是登录用户,第二个是假用户) 而且由于该政策有效,我知道它必须是 in ( ... )
    【解决方案2】:

    您可以定义这样的策略:

    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 的函数。

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

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 2023-02-08
      • 2011-05-03
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      相关资源
      最近更新 更多