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

时间:2018-03-13 16:40:19

标签: postgresql database-design grant user-management row-level-security

我们说我有一个users表,其中包含三列,public_dataprivate_datasystem_data,我有三个名为{{1}的角色}},postgresauthenticated_user

visitor是超级用户,可以访问所有数据(当然包括postgres

system_data应该能够访问每个用户authenticated_user,他们自己的public_data,而不是private_data

system_data只能访问每个用户' visitor

如何设置我的表格,角色,资助和政策以完成上述工作?

1 个答案:

答案 0 :(得分:2)

这不是一个声明性的行安全问题,因为它听起来像是要返回所有行,但根据当前用户显示不同的列值

根据您的评论,您可以使用每种用户类型的不同查询。我找不到使用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;