将行级安全性与列授权相结合
Posted
技术标签:
【中文标题】将行级安全性与列授权相结合【英文标题】:Combining row level security with column grants 【发布时间】:2018-08-22 00:30:13 【问题描述】:假设我有一个包含三列 public_data
、private_data
和 system_data
的 users
表,并且我有名为 postgres
、authenticated_user
和 visitor
的三个角色。
postgres
是超级用户,可以访问所有数据(当然包括system_data
)
authenticated_user
应该可以访问每个用户的public_data
,他们自己的private_data
,但不能访问system_data
visitor
只能访问每个用户的public_data
如何设置我的表、角色、授权和策略来完成上述任务?
【问题讨论】:
【参考方案1】:这并不是一个真正的声明性行安全问题,因为听起来您想返回所有行,但根据当前用户显示不同的列值
根据您的评论,您可以根据用户类型使用不同的查询。我看不到使用 case
声明 private_data
的方法
create table users (
id int primary key,
owner name not null,
public_data text,
private_data text,
system_data text
);
--these should probably be groups, not users:
create user visitor;
create user authenticated_user;
grant visitor to authenticated_user; -- will inherit visitors permissions
grant select(id, owner, public_data) on users to visitor;
grant select(private_data) on users to authenticated_user;
insert into users (id, owner, public_data, private_data, system_data) values (1, 'visitor', 'public', 'private to visitor', 'system');
insert into users (id, owner, public_data, private_data, system_data) values (2, 'authenticated_user', 'public', 'private to authenticated_user', 'system');
set role visitor;
select id, owner, public_data from users;
set role authenticated_user;
select id, owner, public_data, case when owner=current_user then private_data else null end as private_data from users;
set role postgres;
select * from users;
【讨论】:
我使用的工具 (PostGraphile) 对视图的支持有限,所以我不能走这条路。select *
返回错误是可以接受的,因为只会查询特定的列
根据您的更新,您似乎正在避免使用 RLS。有具体原因吗?有没有办法使用 RLS 策略而不是那个 case 语句来实现这一点?
@Julien 我没有使用 RLS,因为您想查看所有行
是的,我把桌子分成了两张桌子。对于它的价值,这也是 Postgraphile 的创建者所建议的。以上是关于将行级安全性与列授权相结合的主要内容,如果未能解决你的问题,请参考以下文章