PostgreSQL 不会递归地撤销角色

Posted

技术标签:

【中文标题】PostgreSQL 不会递归地撤销角色【英文标题】:PostgreSQL doesn't recursively revoke roles 【发布时间】:2015-07-04 08:41:41 【问题描述】:

我在 Windows 7 SP1 64 位上使用 PostgreSQL 9.4,在撤销角色时遇到问题。 假设我有三个用户:taylor、michelle 和超级用户 postgres。 作为 postgres,我将角色 'utente' 授予带有管理员选项的 taylor

--postgres@localhost:5432
GRANT utente TO taylor WITH ADMIN OPTION;

然后,作为泰勒,我将角色 utente 授予米歇尔

--taylor@localhost:5432
GRANT utente TO michelle;

最后,作为 postgres,我撤销了 taylor 的角色 utente

--postgres@localhost:5432
REVOKE utente FROM taylor

这个角色也应该从米歇尔那里递归撤销,因为她只从泰勒那里得到了这个角色。但事实并非如此,泰勒失去了这个角色,但米歇尔保留了它。我尝试使用 RESTRICT 选项运行命令,这应该会阻止它被执行,但它不起作用,命令以完全相同的方式执行,taylor 失去了角色,michelle 保留了它。 谁能给我解释一下?

谢谢。

【问题讨论】:

“这个角色也应该从米歇尔那里被递归撤销,因为她只从泰勒那里得到了这个角色”。这是一个很大的假设。在许多情况下,这样做是非常错误的事情。想象一下,泰勒设置了米歇尔的用户帐户,然后离开了公司。您不希望撤销泰勒的访问权限。 事实上,默认情况下它应该应用 RESTRICT 选项并且不执行命令,告诉我有将被撤销的依赖权限/角色。如果我使用 CASCADE 选项,它应该删除我要撤销的用户授予的所有角色,但它不会这样做。我不明白为什么。 你有没有试过做REVOKE ADMIN OPTION FOR taylor CASCADE;之前REVOKE utente FROM taylor CASCADE; 是的,但它也是如此。 【参考方案1】:

RESTRICT 选项由 PostgreSQL 隐式应用,因此您不必显式指定它。

根据documentation:

用户只能撤销该用户直接授予的权限。例如,如果用户 A 已向用户 B 授予具有授予选项的权限,而用户 B 又将其授予用户 C,则用户 A 不能直接从 C 撤消该权限。相反,用户 A 可以撤消授予选项来自用户 B 并使用 CASCADE 选项,以便依次撤销用户 C 的权限。

所以:

REVOKE utente FROM taylor CASCADE;

但正如您所指出的,这不起作用。看起来这是文档中的错误或错误。

在干净的运行中:

patrick@puny:~$ psql -d pfams
psql (9.4.4)
Type "help" for help.

pfams=# SET SESSION AUTHORIZATION postgres;
SET
pfams=# CREATE ROLE utente NOLOGIN;
CREATE ROLE
pfams=# CREATE ROLE taylor LOGIN;
CREATE ROLE
pfams=# CREATE ROLE michelle LOGIN;
CREATE ROLE
pfams=# GRANT utente TO taylor WITH ADMIN OPTION;
GRANT ROLE
pfams=# SET SESSION AUTHORIZATION taylor;
SET
pfams=> GRANT utente TO michelle;
GRANT ROLE
pfams=# SET SESSION AUTHORIZATION postgres;
SET
pfams=# REVOKE utente FROM taylor CASCADE;
REVOKE ROLE
pfams=# \du taylor
           List of roles
 Role name | Attributes | Member of
-----------+------------+-----------
 taylor    |            | 

pfams=# \du michelle
           List of roles
 Role name | Attributes | Member of
-----------+------------+-----------
 michelle  |            | utente

也许可以向 PostgreSQL 错误邮件列表报告。

【讨论】:

我已经尝试过了,但它不起作用,它做的事情完全相同,从 taylor 而不是从 michelle 撤销 @DevOlly 你是对的,看起来像一个错误。请参阅上面的扩展答案。

以上是关于PostgreSQL 不会递归地撤销角色的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL角色和权限理解

在 PostgreSQL 中撤销另一个用户授予的权限

如何在 PostgreSQL 中默认撤销函数的执行权限

redshift/Postgresql 8.0 撤销连接到用户的数据库

撤销 PostgreSQL 用户的访问权限以查看其他表

postgreSQL