问题描述
从我的模式中给出以下代码段:
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 (将#修改为@)