postgresql Postgres:检查角色是否是组的一部分

svdrlsy4  于 2022-12-03  发布在  PostgreSQL
关注(0)|答案(2)|浏览(156)

我在PostgreSQL中建立了一个数据库。我创建了一些角色和组,并将一些组授予角色(实际上我创建了组的权限,并将新用户授予组)。我在一个表中启用了行级安全性,我想写一个策略来检查用户是否属于某些组,以给予他插入权限。类似于:

CREATE POLICY table_policy_insert ON table
    FOR INSERT
    WITH CHECK(CURRENT_USER IS IN 'admin');

我已经尝试使用CURRENT_USER = 'admin',但这会检查确切的名称,因此如果我有一个管理员用户Poo,这将不起作用

vawmfj5a

vawmfj5a1#

您可以使用以下查询检查用户是否是角色的一部分:

select exists(
  select b.rolname rname,
         c.rolname mname 
  from pg_auth_members a, 
       pg_roles b, 
       pg_roles c  
  where a.roleid=b.oid 
    and a.member = c.oid 
    and b.rolname = 'role_name' 
    and c.rolname = 'user_name');
sr4lhrrt

sr4lhrrt2#

作为一个函数,它甚至更好:

create or replace function is_member_of (username varchar, groupname varchar) 
returns boolean as $$
  select exists (
    select 1 
    from pg_auth_members a, 
         pg_roles b, 
         pg_roles c  
    where a.roleid=b.oid 
      and a.member = c.oid 
      and b.rolname = groupname
      and c.rolname = username
  );
$$ language sql;

select is_member_of ('anna', 'admins');

相关问题