当我在 Postgres 中创建用户时,
create user test with password 'test';
用户最终能够连接到实例中的每个数据库。用户还可以从任何表中进行选择:
# psql -h localhost testdb test
Password for user test: *****
psql (8.4.20, server 9.1.13)
WARNING: psql version 8.4, server version 9.1.
Some psql features might not work.
Type "help" for help.
testdb=> select * from testtable;
id
------------
1
(1 row)
\l
数据库列表显示testdb
有空Access privileges
。那么为什么一个新创建的用户可以连接到那个数据库呢?
新创建的“test”用户还可以从表中选择数据。为什么他可以在没有特权的情况grant
下这样做?select
我想创建一个只能连接到一个数据库并且只能从某些视图中读取的用户。如何防止用户直接从表中读取?
还解决了评论中的问题。
角色
public
根据文档:
大胆强调我的。会员资格
public
不能被撤销(或授予)。您只能从 撤销权限public
。在您的情况下,要阻止所有没有明确权限的角色,例如@Robert 已经提供:角色
postgres
默认情况下,数据库角色
postgres
是 asuperuser
。你可以把它拿走postgres
——但那是不明智的:每个人(包括一些客户端程序)都希望postgres
成为超级用户。您还可以创建更多超级用户(小心!)。超级用户不需要特权。手册再次:至于你的问题:
不完全是。
权限由所有者或超级用户(或被授予权限的角色)授予。
postgres=UC/postgres
将意味着postgres
授予它,这对于空权限是不准确的,但在默认安装中效果是相同的。但是,默认情况下,不会
public
获得新架构的权限,并且只有CONNECT
和TEMP
(可以创建临时表)数据库权限,而不是CREATE
权限(无法创建架构)。这就像=UT/??
根据可能的特权列表 -再次手册:您可以更改默认权限。我在评论中提到的相关答案中写了更多关于此的内容:
但这些默认权限仅适用于更改默认值后创建的对象。那么空的 ACL 条目是什么意思呢?系统目录上的手册
pg_default_acl
:大胆强调我的。
要解决为什么 test 可以
SELECT
从没有 a 的表中的问题GRANT
,这是因为您没有显式运行REVOKE
从 连接到数据库的能力PUBLIC
,然后显式GRANT
为您的test
用户运行:完成后,您将
REVOKE SELECT
为该数据库中的用户提供您希望阻止用户访问的表和其他项目,然后显式访问GRANT SELECT
视图。请注意,此处的用户也可以是角色,然后可以添加多个用户。