Postgres行级安全性插入返回

问题描述

从我的模式中给出以下代码段:

create table users (
  id   serial primary key,name text not null
);

create table user_groups (
  id   serial primary key,name text not null
);

create table user_user_group (
  user_id       integer not null references users(id),user_group_id integer not null references user_groups(id)
);

grant all on users to staff;
grant all on user_groups to staff;
grant all on user_user_group to staff;

create function can_access_user_group(id integer) returns boolean as $$
  select exists(
    select 1
    from user_user_group
    where user_group_id = id
    and user_id = current_user_id()
  );
$$ language sql stable security invoker;

create function can_access_user(id integer) returns boolean as $$
  select exists(
    select 1
    from user_user_group
    where user_id = id
    and can_access_user_group(user_group_id)
  );
$$ language sql stable security invoker;

alter table users enable row level security;
create policy staff_users_policy
  on users
  to staff
  using (
    can_access_user(id)
  );

请承担staff角色,并且current_user_id()函数已经过测试并且可以正常工作。我希望允许“工作人员”角色通过user_user_group表在他们可以访问的用户组中创建用户。以下语句使staff_users_policy失败:

begin;
set local role staff;

with new_user as (
  insert into users (
    name
  ) values (
    'Some name'
  )
  returning id
) 
insert into user_user_group (
  user_id,user_group_id
) 
select 
  new_user.id,1 as user_group_id
from new_user;
          
commit;

我可以这样添加staff_insert_users_policy

create policy staff_insert_users_policy
  on users
  for insert
  to staff
  with check (
    true
  );

这允许我插入用户,但在returning id上失败,并且我需要新的用户ID才能将行添加到user_user_group表中。

我理解为什么它会失败,但是从概念上讲我该如何避免这个问题?我可以为此创建一个“定义”功能,或者使用它自己的策略创建一个新角色,但我希望有一种更简单的方法。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...