【发布时间】:2013-05-01 07:37:28
【问题描述】:
我想在我的 Postgresql 数据库中创建一些角色并授予一些访问权限。
我有学生角色,我想授予此用户类型:只能编辑在学生表中记录他/她,不能编辑其他行
我该怎么做?
谢谢
【问题讨论】:
标签: postgresql sql-grant
我想在我的 Postgresql 数据库中创建一些角色并授予一些访问权限。
我有学生角色,我想授予此用户类型:只能编辑在学生表中记录他/她,不能编辑其他行
我该怎么做?
谢谢
【问题讨论】:
标签: postgresql sql-grant
使用适当的 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;
顺便说一句,您无法更新视图是一种普遍存在的误解,但只有当视图是连接或类似复杂的查询时才会这样。
【讨论】:
...where id in (1,3,5,8,etc)
PostgreSQL 没有行级别的声明式安全性(但是,正在进行的工作),所以如果你不能只创建一个视图 - 比如说,如果你有很多不同的人需要这种访问 - 你可能需要SECURITY DEFINER helper function 或触发器。
你有几个选择:
SECURITY DEFINER 函数,让他们只进行允许的更改并将他们对表的访问权限限制为SELECT,撤销UPDATE、DELETE、TRUNCATE 和INSERT 权限;或GRANT 他们对表的写入权限。在这两者中,函数和受限权限方法是到目前为止最安全的选择,只要您遵循上面设置的 SECURITY DEFINER 安全编码准则 - 为函数设置 search_path,避免带有字符串替换等的动态 SQL (EXECUTE)。
如果是一个按current_user 过滤的视图,上面给出的视图方法可以很好地工作。您可能还想查看新的SECURITY BARRIER 视图;请参阅 this post 以了解对它们的有用讨论。
【讨论】: