PostgreSQL行级安全插入策略失效:非白名单账号可插入数据
PostgreSQL行级安全策略失效问题排查与修复
1. 首要错误:SQL关键字拼写错误
你的插入策略中,将判断存在性的关键字EXISTS误写为EXIST,这会导致PostgreSQL无法识别该校验逻辑,使得白名单验证完全失效,因此非白名单数据也能成功插入。
2. 必要前提:确认表已启用行级安全
如果未给promo表开启行级安全,即使策略编写正确也不会生效,需要先执行以下语句:
ALTER TABLE public.promo ENABLE ROW LEVEL SECURITY;
3. 修正后的完整策略
将EXIST改为EXISTS,同时子查询只需返回任意值(比如1)即可完成存在性判断,无需返回具体字段:
CREATE POLICY "Role Api can create a promo of the user if exists on the whitelist." ON public.promo FOR INSERT TO role_api WITH CHECK ( EXISTS (SELECT 1 FROM public.promo_whitelist AS pw WHERE pw.seller_id = promo.seller_id AND pw.promo_type = promo.promo_type ) );
4. 权限优化建议
无需授予role_api全表权限,遵循最小权限原则,仅授予插入权限即可:
GRANT INSERT ON TABLE public.promo TO role_api;
验证:切换到role_api身份插入非白名单数据,此时应该触发行级安全限制,返回报错信息。
内容的提问来源于stack exchange,提问作者niepl
相关产品推荐
相关产品推荐

