【问题标题】:how to grant update or select on some specified row in postgresql table?如何在 postgresql 表中的某些指定行上授予更新或选择?
【发布时间】:2013-05-01 07:37:28
【问题描述】:

我想在我的 Postgresql 数据库中创建一些角色并授予一些访问权限。

我有学生角色,我想授予此用户类型:只能编辑在学生表中记录他/她,不能编辑其他行

我该怎么做?

谢谢

【问题讨论】:

    标签: postgresql sql-grant


    【解决方案1】:

    使用适当的 where 子句在表上创建一个视图,然后授予对其的访问权限:

    create view students_view as
    select col1, col2, col3 -- limit column access here
    from mytable
    where <whatever>; -- limit row access here
    
    -- limit what he can do here
    grant update, select to student_role;
    

    顺便说一句,您无法更新视图是一种普遍存在的误解,但只有当视图是连接或类似复杂的查询时才会这样。

    【讨论】:

    • 直到最近的 Pg 版本才需要明确的触发器或规则才能使视图可更新,所以它是真的。
    • 插入呢?假设您的过滤条件是 foo="bar"。如果用户插入 student_view(foo) 值(“bar”)会发生什么;甚至,更新students_view set foo="bar";他们能做到吗?无论如何要限制这种行为?
    • @chris 在我看来,带有 foo=bar 应该 的新行/更新行应该是可见的。如果这样不好,要么缩小过滤器,要么使用 id 过滤特定的 id 白名单...where id in (1,3,5,8,etc)
    【解决方案2】:

    PostgreSQL 没有行级别的声明式安全性(但是,正在进行的工作),所以如果你不能只创建一个视图 - 比如说,如果你有很多不同的人需要这种访问 - 你可能需要SECURITY DEFINER helper function 或触发器。

    你有几个选择:

    • 编写一个SECURITY DEFINER 函数,让他们只进行允许的更改并将他们对表的访问权限限制为SELECT,撤销UPDATEDELETETRUNCATEINSERT 权限;或
    • 编写一个触发器,试图限制他们进行您不希望他们进行的更改,并GRANT 他们对表的写入权限。

    在这两者中,函数和受限权限方法是到目前为止最安全的选择,只要您遵循上面设置的 SECURITY DEFINER 安全编码准则 - 为函数设置 search_path,避免带有字符串替换等的动态 SQL (EXECUTE)。

    如果是一个按current_user 过滤的视图,上面给出的视图方法可以很好地工作。您可能还想查看新的SECURITY BARRIER 视图;请参阅 this post 以了解对它们的有用讨论。

    【讨论】:

      猜你喜欢
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多