由 John Doe 六月 27, 2025
你想控制用户在 public 模式中创建表的权限吗?
特性提交日志
撤销从 public 模式创建表的权限,现在由 pg_database_owner 拥有。
这将默认访问控制列表 (ACL) 切换为自 CVE-2018-1058 以来文档所推荐的设置。升级将保留任何旧的所有权和 ACL。之前未采纳 2018 年建议的站点应重新审视。从头开始部署新数据库集群的方案可能需要创建模式、授予更多权限等。外部测试套件可能需要此类更新。
讨论:https://postgr.es/m/20201031163518.GB4039133@rfd.leadboat.com
示例
在之前的 PostgreSQL 版本中,默认允许任何用户连接到任何数据库,并在默认创建的 “public” 模式中创建新表(以及视图等)。有一些人认为这会产生安全问题,会将 public 模式删除掉,或者收紧 public 模式的访问权限。
但现在情况发生了变化。在新的 PostgreSQL 版本中,默认情况下,非超级用户账户将无法在非其拥有的数据库的 public 模式中创建表。
让我们来看一下:
CREATE DATABASE x;
CREATE USER test;
CREATE DATABASE test WITH OWNER test;
上面,我们创建了 test 用户和两个数据库,“x” 数据库由超级用户拥有,以及由 test 用户拥有的 “test” 数据库。
当我们进入两个数据库创建表时,结果如下:
$ psql -U test -d x -c 'create table a (b int)'
ERROR: permission denied for schema public
LINE 1: create table a (b int)
^
$ psql -U test -d test -c 'create table a (b int)'
当然,你仍然可以向 public 模式授予所有权限,以保留以前的行为,但默认情况下,将不再允许在属于其他用户的数据库中创建对象。
非常不错的特性。感谢社区的所有相关人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/b073c3ccd06e4cb845e121387a43faa8c68a7b62