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 不会递归地撤销角色的主要内容,如果未能解决你的问题,请参考以下文章