Supabase RLS 布尔字段校验问题:更新触发权限错误
问题原因及解决方案
问题根源
你的RLS策略中,WITH CHECK (pool_item_is_opened = false)强制要求更新后的行必须保持pool_item_is_opened为false,但你在Flutter代码里更新时,把这个字段设为了true,直接违反了这个约束,所以触发了权限错误。
策略里的USING条件是检查更新前的行状态(允许操作未打开的行),但WITH CHECK是对更新后的行做强制校验,两者结合后,你的更新操作刚好触碰了这个限制。
修正方案
如果你要实现的是「允许认证用户将未打开的卡片标记为已打开」,需要调整RLS策略的WITH CHECK部分:
CREATE POLICY "Users can mark unopened card as opened" ON "public"."pool" AS PERMISSIVE FOR UPDATE TO authenticated USING (pool_item_is_opened = false) -- 仅允许操作未打开的行 WITH CHECK ( pool_item_is_opened = true AND pool_opened_user_id = auth.uid() -- 可选:确保标记的用户ID是当前登录用户,防止篡改 );
说明
USING条件保留,确保只能对原本未打开的行进行更新;WITH CHECK改为允许更新后pool_item_is_opened为true,同时添加pool_opened_user_id = auth.uid()可以避免用户恶意设置其他用户ID,提升数据安全性。
内容的提问来源于stack exchange,提问作者Emirhan Gümüş
相关产品推荐
相关产品推荐

