【问题标题】:Combining row level security with column grants将行级安全性与列授权相结合
【发布时间】:2018-08-22 00:30:13
【问题描述】:

假设我有一个包含三列 public_dataprivate_datasystem_datausers 表,并且我有名为 postgresauthenticated_uservisitor 的三个角色。

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

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

visitor只能访问每个用户的public_data

如何设置我的表、角色、授权和策略来完成上述任务?

【问题讨论】:

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


    【解决方案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 的创建者所建议的。
    猜你喜欢
    • 1970-01-01
    • 2013-11-02
    • 2018-07-09
    • 2011-08-20
    • 1970-01-01
    • 2021-07-09
    • 2018-11-11
    • 2017-05-10
    相关资源
    最近更新 更多