基于关系 table 数据的行级安全性
Row-level-security based on relation table data
我正在学习 Supabase 并且为了练习,我正在 制作一个 suuuper 简化的网站构建器 。
但是我在行级安全策略方面遇到了麻烦。
我有三个table:
- 用户 → 包含用户的名字、姓氏等信息
- 网站 → 所有网站
- user_website →包含哪个网站属于哪个人的信息(因为一个网站可以owned/editted被多个用户使用)
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
我正在学习 Supabase 并且为了练习,我正在 制作一个 suuuper 简化的网站构建器 。
但是我在行级安全策略方面遇到了麻烦。
我有三个table:
- 用户 → 包含用户的名字、姓氏等信息
- 网站 → 所有网站
- user_website →包含哪个网站属于哪个人的信息(因为一个网站可以owned/editted被多个用户使用)
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