我第一次尝试创建Postgres数据库。
我为DB角色分配了基本的只读权限,该角色必须从我的PHP脚本访问数据库,我有一个好奇心:如果我执行
GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;
有必要也执行这个吗?
GRANT USAGE ON SCHEMA schema TO role;
关于documentation:
用法:对于模式,允许访问包含在指定模式中的对象(假设也满足对象自己的权限要求)。本质上,这允许被授权者在模式中“查找”对象。
我认为,如果我可以选择或操作模式中包含的任何数据,我就可以访问模式本身的任何对象。我说错了吗?如果不是,GRANT USAGE ON SCHEMA
是用来做什么的?文档中的“假设对象自己的特权需求也得到满足”究竟是什么意思?
4条答案
按热度按时间soat7uwm1#
GRANT
s在不同的对象上是分开的。在数据库上执行操作不会对其中的模式具有GRANT
权限。类似地,对模式执行GRANT
操作不会授予对其中表的权限。如果您有权从表中访问
SELECT
,但无权在包含它的模式中查看它,则无法访问该表。权限测试按以下顺序进行:
您的困惑可能源于这样一个事实,即
public
模式对角色public
具有所有权限的默认GRANT
,每个用户/组都是该角色的成员。所以每个人都已经使用了这个模式。短语:
(假设也满足对象自己的特权要求)
是说你必须在一个模式上拥有
USAGE
才能使用其中的对象,但是在一个模式上拥有USAGE
本身并不足以使用模式中的对象,你还必须对对象本身拥有权限。就像一个目录树。如果你创建了一个目录
somedir
,其中包含文件somefile
,然后将其设置为只有你自己的用户可以访问该目录或文件(目录上的模式为rwx------
,文件上的模式为rw-------
),那么没有人可以列出该目录以查看该文件是否存在。如果您授予文件的全局读取权限(模式
rw-r--r--
),但不更改目录权限,则没有任何区别。没有人可以看到文件来读取它,因为他们没有列出目录的权限。如果您在目录上设置
rwx-r-xr-x
,设置它以便人们可以列出和遍历目录,但不更改文件权限,人们可以列出文件,但不能读取它,因为他们没有访问文件的权限。您需要设置 both 权限,以便人们能够实际查看该文件。
同样的事情在PG。要对对象(如表中的
SELECT
)执行操作,您需要USAGE
模式权限和对象权限。(The这个类比福尔斯站不住脚,因为PostgreSQL还没有行级安全性,所以用户仍然可以通过直接从
pg_class
读取SELECT
来“看到”表存在于模式中。他们不能以任何方式与它交互,虽然,所以它只是“列表”部分不太一样。pftdvrlh2#
对于生产系统,您可以使用以下配置:
dxxyhpgq3#
好了,这是我对Linux的简单db的最终解决方案:
dy1byipe4#
只有在分配了用户之后,我才设法对数据库执行操作
因为我在那里使用了flywaydb。
也许这就足够了: