Supabase Postgres RLS条件插入权限配置问题求助
解决方案:配置RLS实现仅允许插入所属记录的关联关系
1. 正确的RLS插入策略
你之前的尝试混淆了RLS中USING和WITH CHECK的作用:USING子句用于判断用户是否具备插入权限(通常基于表中已存在的数据),而要验证待插入行的条件,必须使用WITH CHECK子句,并且通过NEW关键字访问待插入的字段值。
以下是满足需求的正确策略:
-- 确保records_users表已启用行级安全 ALTER TABLE public.records_users ENABLE ROW LEVEL SECURITY; -- 创建插入策略 CREATE POLICY "仅允许插入自己创建的记录的关联关系" ON public.records_users FOR INSERT WITH CHECK ( EXISTS ( SELECT 1 FROM public.records WHERE records.record_id = NEW.record_id AND records.created_by = auth.uid() ) );
这个策略会验证:待插入的record_id对应的records表记录,其created_by字段必须等于当前认证用户的ID(auth.uid()),只有满足条件的插入操作才会被允许。
2. RPC函数的补充方案(若需保留函数实现)
如果坚持用RPC函数完成插入,可在函数内自行实现权限校验,同时通过SECURITY DEFINER绕过RLS限制(需注意安全控制):
CREATE OR REPLACE FUNCTION public.insert_records_users(p_record_id INT, p_user_id INT) RETURNS void AS $$ BEGIN -- 先验证当前用户是否有权限操作该record IF NOT EXISTS ( SELECT 1 FROM public.records WHERE record_id = p_record_id AND created_by = auth.uid() ) THEN RAISE EXCEPTION '无权限插入该记录的关联关系'; END IF; -- 执行插入操作 INSERT INTO public.records_users(record_id, user_id) VALUES(p_record_id, p_user_id); END; $$ LANGUAGE plpgsql SECURITY DEFINER SET search_path = public; -- 授权普通认证用户调用该函数 GRANT EXECUTE ON FUNCTION public.insert_records_users(INT, INT) TO authenticated;
该函数会先自行校验权限,再执行插入,既避免了无限制开放records_users的插入权限,也能通过RPC完成业务操作。
内容的提问来源于stack exchange,提问作者Fredaroo
相关产品推荐
相关产品推荐

