PostgreSQL行级安全策略未生效,设置using(null)仍返回全部行
嘿,这个问题我之前也碰到过,核心是PostgreSQL视图的安全执行上下文在搞鬼!
问题根源
你设置的行级安全策略本身没问题,但默认情况下,PostgreSQL的视图会以视图创建者的身份去访问底层表,而不是当前执行查询的anonymous角色。
看你的操作流程:
- 你用拥有超级权限的用户(比如默认的
postgres)创建了api.mytable视图 - 给
anonymous授权查询这个视图 - 虽然
private.mytable开启了行级安全,且策略是using (null),但当anonymous查视图时,视图实际是用创建者的超级用户身份去读private.mytable——而超级用户默认不受行级安全策略约束,所以策略完全没生效,自然返回了所有行。
两种修复方案
方案一:让视图以当前用户身份执行
修改视图的创建语句,添加SECURITY INVOKER属性,这样视图会用当前查询用户的身份去访问底层表:
create view api.mytable with (security invoker) as select * from private.mytable;
当anonymous查询这个视图时,就会以anonymous的身份读取private.mytable,这时行级安全策略using (null)就会生效,过滤掉所有行,符合你的预期。
方案二:强制超级用户遵守行级安全
如果你不想修改视图,也可以给private.mytable开启force_row_level_security,让超级用户也必须遵守行级安全策略:
alter table private.mytable force row level security;
这样哪怕视图用超级用户身份查询表,也会被using (null)的策略限制,返回空结果。
验证
修改后重新执行查询:
set role anonymous; select * from api.mytable;
这次就会返回空结果啦。
内容的提问来源于stack exchange,提问作者Alex Kubica
相关产品推荐
相关产品推荐

