我遵循了两个教程来使用以下内容创建数据库:
然后,我从CJ Estel的教程中获得了一条提示,指出“ 即使我们从未明确将其提供给新用户,您也可能继承了创建表的功能”。果然,只读用户能够创建和拥有表!
CJ Estel指出了根本原因,即模板数据库。但是创建表的功能破坏了您通过搜索“只读用户postgres”获得的大多数教程,包括postgresql.org上托管的教程。您的用户不仅具有只读权限!
为什么新用户具有此功能?撤消该特权后,数据库对于该用户是否真正是只读的?
我遵循了两个教程来使用以下内容创建数据库:
然后,我从CJ Estel的教程中获得了一条提示,指出“ 即使我们从未明确将其提供给新用户,您也可能继承了创建表的功能”。果然,只读用户能够创建和拥有表!
CJ Estel指出了根本原因,即模板数据库。但是创建表的功能破坏了您通过搜索“只读用户postgres”获得的大多数教程,包括postgresql.org上托管的教程。您的用户不仅具有只读权限!
为什么新用户具有此功能?撤消该特权后,数据库对于该用户是否真正是只读的?
Answers:
TL; DR:新用户可以在public
架构中创建表,因为人们抱怨说,如果不能这样做,那就太难了。
如果您不喜欢默认值,则可能应该使用所需的初始配置创建一个新的模板数据库。例如,您可能会:
DROP SCHEMA public;
要么
REVOKE ALL ON SCHEMA public FROM public;
GRANT USAGE ON SCHEMA public TO public;
在您的模板中。
如果希望public
用户对数据库没有权限,则还应该:
REVOKE ALL ON DATABASE mydbname FROM public;
GRANT CONNECT ON DATABASE mydbname TO public;
因此public
用户无法创建架构或使用临时表。
就我个人而言,如果我正在设计此程序,则TEMP
默认情况下,我将授予用户对数据库的权限,而不是CREATE
(数据库CREATE
中的public
方案)或(架构中的表)权限。我把那些留给主人。
但是,它们是很久以前做出的选择,现在很难更改它们。
实际上,经常有抱怨说,开始使用PostgreSQL太困难了,因为您必须创建一个用户帐户,并且经常也想创建一个数据库。为什么我们不自动创建它们并默认使用“信任”作为身份验证模式以使其变得容易呢?postgres
用户为什么不默认使用密码postgres
?如果操作系统中存在用户,为什么我们不自动创建用户呢?等等
对于新用户而言,确实存在一些实用性问题-特别是,大多数人不知道peer
auth是什么,或者为什么仅psql
在安装PostgreSQL后运行才能告诉他们没有以登录名命名的用户。
pg_hba.conf
配置文件也很麻烦,但是用户是在SQL级别创建的。这种划分使用户感到困惑。
但是,很多事情是安全默认值和简单默认值之间的折衷,在这种情况下,项目永远都不会令所有人满意。
revoke create on database [databasename] from [username];
,现在数据库仅对[username]只读。对?当我读到一本好的Postgres书时,我将再次回到这个答案:)