PostgreSQL中通过角色组授予BYPASSRLS权限失效问题求助
PostgreSQL角色继承BYPASSRLS权限失效的解决方案
问题根源
PostgreSQL中BYPASSRLS是仅能直接赋予用户的安全敏感属性,无法通过角色继承获得。哪怕创建了带BYPASSRLS的角色并授予用户,用户也不会继承这个权限——这是系统为安全设计的硬性限制。
正确实现方式
方案1:角色管理常规权限,单独给用户加BYPASSRLS
保留角色用于统一管理查询、Schema权限,直接给目标用户添加BYPASSRLS属性:
-- 创建无登录角色,管理常规权限 create role group nologin; grant usage on schema public to group; grant select on all tables in schema public to group; -- 创建用户时直接赋予BYPASSRLS,再授予角色 create user archibald password 'password' bypassrls; grant group to archibald;
方案2:批量给角色下的用户添加BYPASSRLS
如果有多个用户需要加入该角色并获得BYPASSRLS,可以用动态SQL批量处理:
-- 批量给所有属于group角色的用户添加BYPASSRLS do $$ declare rec record; begin for rec in select usename from pg_user u join pg_auth_members m on u.usesysid = m.member join pg_roles r on m.roleid = r.oid where r.rolname = 'group' loop execute format('alter user %I bypassrls', rec.usename); end loop; end $$;
补充说明
后续新增用户加入group角色时,需要同时执行alter user <用户名> bypassrls,或者用上述脚本定期执行,也可以编写事件触发器,在用户被授予group角色时自动添加BYPASSRLS属性。
内容的提问来源于stack exchange,提问作者Roelof Coster
相关产品推荐
相关产品推荐

