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

时间:2015-09-14 23:26:23

标签: sql database postgresql ubuntu privileges

我负责一个拥有23个用户和23个数据库的大学课程的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".

2 个答案:

答案 0 :(得分:1)

此:

REVOKE ALL PRIVILEGES ON DATABASE group1 FROM PUBLIC;
除非您以超级用户身份创建group3,否则

就足够了。

答案 1 :(得分:1)

到目前为止我们所看到的并不能解释会发生什么。

如果您的用户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具有超级用户权限:

SELECT rolname, rolsuper
FROM   pg_roles
WHERE  rolname = 'group3';