撤销 PostgreSQL 的权限

led*_*sma 6 postgresql postgresql-9.2

我试图撤销用户对数据库的所有权限,但我无法让它工作。

我在做:

REVOKE ALL PRIVILEGES ON DATABASE db1 FROM user1;
Run Code Online (Sandbox Code Playgroud)

IMS*_*SoP 4

REVOKE ALL指的是一个对象的所有权限,而不是任何相关对象的权限。在这种情况下,您所说的是“作为单个对象应用于数据库的所有权限”。数据库级别存在的唯一权限是CONNECT,默认情况下,该权限被授予特殊角色Public,所有其他角色都是该角色的成员。

因此,要以这种方式拒绝用户的访问,您必须从 Public 撤销 CONNECT 权限,然后将其显式授予您确实想要授予访问权限的角色。

我想到了其他一些选择:

  • 在 pg_hba.conf 中为用户和数据库的组合设置 DENY 规则
  • 撤销数据库中所有模式的 USAGE,以便它们可以连接但不能访问任何内容。我相信该public架构已将其授予公共角色,因此您需要像 CONNECT 一样首先撤销
  • 撤销数据库内的所有对象。这需要多个语句,例如REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo FROM somebody针对不同的对象类型。您还应该使用它ALTER DEFAULT PRIVILEGES来确保您从现在开始创建的对象将无法访问。