加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 18:10:10 所属栏目:百科 来源:网络整理
导读:假设我有一个包含三列的用户表,public_data,private_data和system_data,我有三个名为postgres,authenticated_user和visitor的角色. postgres是超级用户,可以访问所有数据(当然包括system_data) authenticated_user应该能够访问每个用户的public_data,他们自
假设我有一个包含三列的用户表,public_data,private_data和system_data,我有三个名为postgres,authenticated_user和visitor的角色.

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

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

访问者只能访问每个用户的public_data

如何设置表格,角色,授权和策略以完成上述操作?

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

根据您的评论,您可以使用每种用户类型的不同查询.我没有看到使用private_data的case语句的方法

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,private_data,system_data) values (1,'visitor','public','private to visitor','system');

insert into users (id,system_data) values (2,'authenticated_user','private to authenticated_user','system');

set role visitor;
select id,public_data from users;

set role authenticated_user;
select id,case when owner=current_user then private_data else null end as private_data from users;

set role postgres;
select * from users;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读