我想在Postgresql DB中创建一些角色并授予一些访问权限。
我有学生角色,我想授予此用户类型:可以编辑只在学生表中记录他/她并且不能编辑其他行
我该怎么做?
感谢
答案 0 :(得分:4)
使用适当的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;
BTW一个常见的误解是你无法更新视图,但只有当视图是连接或类似的复杂查询时才会出现这种错误。
答案 1 :(得分:4)
PostgreSQL没有行级声明式安全性(但是,它正在进行中),所以如果你不能创建一个视图 - 比方说,如果你有许多不同的人需要这种访问 - 你可能需要SECURITY DEFINER
helper function或触发器。
你有几个选择:
SECURITY DEFINER
函数,该代码只允许他们进行允许的更改,并将他们对表的访问权限限制为SELECT
,撤消UPDATE
,DELETE
,{{1} }和TRUNCATE
权利;或INSERT
他们写入对该表的访问权。在这两者中,功能和限制权利方法到目前为止是最安全的选项,只要您遵循上面设置的GRANT
安全编码指南 - 设置SECURITY DEFINER
为该函数,避免使用字符串替换等动态SQL(search_path
)
如果是按EXECUTE
过滤的视图,上面给出的视图方法可以很好地工作。您可能还想查看新的current_user
观看次数;有关它们的有用讨论,请参阅this post。