【发布时间】:2021-11-14 14:35:36
【问题描述】:
我将 RLS(行级安全性)与 supbase.io 一起用于“无服务器”应用程序。我必须为 RLS 策略使用各种安全定义器功能。这些仍然可以通过 supabase 的 rpc 库调用。是否有限制调用这些函数只能由管理员(我)或作为 RLS 策略的一部分使用?
例如:
CREATE OR REPLACE FUNCTION get_bases_editable_or_viewable_for_user(user_id uuid, allow_edit bool)
returns setof bigint as $$
select base_id
from access_controls
where access_controls.user_id = $1 AND ($2 AND access_controls.access_level = 'editor') OR access_controls.access_level = 'viewer';
$$ stable language sql security definer;
CREATE policy "Users can read bases they are editors or viewers of"
on public.bases
for select using ( bases.id in (get_bases_editable_or_viewable_for_user(auth.uid(), true)) );
get_bases_editable_or_viewable_for_user 允许任何用户在拥有另一个用户的 UID 后,找出该用户作为编辑者或查看者可以访问的 UID:
supabase.rpc(
"get_bases_editable_or_viewable_for_user",
{ user_id: "dddddde6-1111-4bdf-aaaa-33336ccc31ee", allow_edit: true }
)
.then(console.log) // => bad
最大限度地减少信息泄露的机会对于最大限度地提高应用程序的安全性和用户的隐私至关重要。
【问题讨论】:
-
与其在此重复,请查看CREATE POLICY 的Notes 部分。简短版本的策略以运行查询的用户的权限运行。因此,如果管理员以外的用户要运行查询,则不能过多地限制访问。
-
策略定义的
USING子句必须返回boolean。这样的函数不会泄露它不应该泄露的信息。 -
@LaurenzAlbe 抱歉,我有一些如何设法粘贴一些损坏的代码。我现在已经修好了。我看不出如何将
bases.id移动到函数中。
标签: postgresql row-level-security supabase