sql - 撤销对数据库的访问似乎不起作用

标签 sql database postgresql ubuntu privileges

我负责一个有 23 个用户和 23 个数据库的大学类(class)的 PostgreSQL 数据库。每个用户应该只能访问一个数据库,如果他们尝试连接到不同的数据库,他们应该会被拒绝访问。
我已经有一个工作集,但我们必须格式化服务器。现在我正在尝试做同样的事情,但每个用户都可以访问彼此的数据库。我已经尝试过:

REVOKE connect ON DATABASE group1 FROM PUBLIC;
REVOKE ALL PRIVILEGES ON DATABASE group1 FROM PUBLIC;
REVOKE ALL PRIVILEGES ON DATABASE group1 FROM group3;

而且我仍然可以通过任何方式连接到 group1 数据库:
psql -d group1

或者
\c group1

我怎样才能阻止这种情况发生?

编辑:我使用的是 PostgreSQL 9.3.9。
我所做的是以 root 身份登录,然后通过以下方式将用户更改为 group3:
sudo su -
su group3
psql
Enter password:
\c group1
You are now connected to database "group1" as user "group3".

最佳答案

到目前为止,我们所看到的无法解释发生了什么。

如果您的用户 group3已被授予其他角色(是其他角色的成员),并且其中一个角色(递归!)具有可以解释它的访问权限:

SELECT r0.rolname AS parent, r1.rolname AS member
FROM   pg_roles r0
JOIN   pg_auth_members m ON m.roleid = r0.oid
JOIN   pg_roles r1 ON r1.oid = m.member
WHERE  r1.rolname = 'group3';

或者如果 group3具有 super 用户权限:
SELECT rolname, rolsuper
FROM   pg_roles
WHERE  rolname = 'group3';

关于sql - 撤销对数据库的访问似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32575420/

相关文章:

mysql - 从两个以上的表中检索数据

node.js - 如何通过 API 使用 BookshelfJS 在 SQL DB 中查找一个 INT 和所有 INT

sql - 选择时如何忽略某些相似的行

php - 如何使用SQL比较多个字段?

php - 唯一键、INSERT IGNORE 和表分区

database - 违反了第一范式,可以满足我的目的吗?

mysql - 如何将员工和用户保存在单独的表中,并使用另一个为他们提供通用 accountID 的表?

mysql - 创建索引导致 'Lost connection to MySQL'

postgresql - 连接到postgresql数据库时出现matlab错误

postgresql - 使用 Maven Mojo sql :execute 时出错