【问题标题】:Grant access to subset of table to user on PostgreSQL向 PostgreSQL 上的用户授予对表子集的访问权限
【发布时间】:2011-05-14 19:38:56
【问题描述】:

我知道我可以使用视图来授予对表中属性子集的访问权限。但是我怎样才能只授予对特定元组的访问权限呢?假设我有一个注册学生表,一个用户名属性,然后是其他一些像 degree_status,我如何授予访问权限,以便用户 A 只能从表中选择一个与用户名 A 对应的元组?我有一个数据库考试,我正在研究一些过去的论文,我遇到了这个问题,但我不知道如何回答它,我无法从我的书“数据库系统:数据库设计的实用方法”中找到如何做、实施和管理'

非常感谢任何帮助!

马特

【问题讨论】:

标签: sql database postgresql privileges sql-grant


【解决方案1】:

说你得到了:

Table items (item_id, ...)
Table users (user_id, ...)
Table users_permissions( user_id, item_id, perm_type )

你可以像这样创建一个视图:

SELECT i.*, p.perm_type 
FROM items JOIN users_permissions USING (item_id) 
WHERE user_id = get_current_user_id();

用户可以从此视图中进行选择,但不能删除限制权限的 WHERE 和 JOIN。

get_current_user_id() 函数可能是主要问题;)

【讨论】:

  • 如果每个“真实”用户使用不同的 Postgres 用户帐户应该很容易,那么 get_current_user_id() 就是 current_user
  • 是的。 是一个 PITA,但另一方面,它是让数据库强制执行权限的唯一方法。拥有数以亿计的数据库用户是主要问题。如果你有 10 个用户,那就去吧。
  • 谢谢,这正是我所需要的。我不知道这个功能,非常有用:)
【解决方案2】:

按照 peufeu 的回答,在 Postgresql 中,当前用户名可通过函数 current_user 获得。所以一个视图

CREATE VIEW available_bigtable AS
SELECT * FROM bigtable
WHERE username = current_user;

看起来它可以满足您的需求。将SELECT 授予视图中的每个人,但不授予底层bigtable 上的任何人(管理员除外)。

【讨论】:

  • 非常有用,感谢您的帮助,这个 current_user 函数正是我所需要的 :)
  • “接受”按钮必须在某处。 :)
【解决方案3】:

Veil 项目为 PostgreSQL 中的行级访问控制提供了一个框架。

【讨论】:

    【解决方案4】:

    创建一个获取用户 ID 并返回他有权访问的行子集的函数怎么样?

    CREATE FUNCTION user_items(integer) RETURNS SETOF items AS $$
        SELECT * FROM items WHERE user_id = $1
    $$ LANGUAGE SQL;
    
    SELECT * FROM user_items(55); # 55 being the user id
    

    edit仔细想想,这可能会导致相当大的性能损失,因为 user_id 条件将在任何其他“用户空间”条件之前应用于整个数据集。

    例如,SELECT * FROM user_items(55) WHERE id=45 将首先过滤整个表中的用户项目,然后仅在该子集上查找 ID。

    使用视图,查询计划者可以决定评估条件的最佳顺序(他可能会首先过滤 ID,而不是用户 ID)。当使用我建议的功能时,postgres 不能这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 2022-10-21
      • 1970-01-01
      相关资源
      最近更新 更多