将行级安全与列授权相结合

11
假设我有一个名为users的表格,其中包括三个列:public_dataprivate_datasystem_data,并且我有三个角色:postgresauthenticated_uservisitorpostgres 是超级用户,可以访问所有数据(包括system_data)。 authenticated_user 应该能够访问每个用户的public_data,自己的private_data,但不能访问system_datavisitor 只能访问每个用户的public_data
如何设置我的表格、角色、授权和策略以实现上述目标?
1个回答

4
这不是一个声明性行安全问题,因为你似乎想要返回所有行,但根据当前用户显示不同的列值。
根据您的评论,您可以接受每个用户类型不同的查询。我看不到避免使用 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;

3
我使用的工具(PostGraphile)对视图的支持有限,所以我无法采用这种方法。 - Julien
只查询特定的列,因此出现“select *”返回错误是可以接受的。 - Julien
根据您的更新,看起来您正在避免使用RLS。有具体原因吗?是否有一种方法可以使用RLS策略使其工作,而不是使用那个case语句? - Julien
@Julien 我没有使用行级安全性,因为你想要查看所有行。 - Neil McGuigan
5
是的,我把桌子分成了两张。就这个意义而言,这也是Postgraphile的创作者建议的做法。 - Julien
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接