2

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

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

我该怎么做?

谢谢

4

2 回答 2

5

使用适当的 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;

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

于 2013-05-01T07:42:18.090 回答
4

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

你有几个选择:

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

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

上面给出的视图方法可以很好地工作,如果它是一个过滤的视图current_user。您可能还想查看新SECURITY BARRIER视图;有关它们的有用讨论,请参见这篇文章

于 2013-05-01T08:09:41.743 回答