【问题标题】:PostgreSQL doesn't recursively revoke rolesPostgreSQL 不会递归地撤销角色
【发布时间】: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;
  • 是的,但它也是如此。

标签: sql database postgresql postgresql-9.4


【解决方案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 你是对的,看起来像一个错误。请参阅上面的扩展答案。
猜你喜欢
  • 2018-09-29
  • 1970-01-01
  • 2016-10-14
  • 2021-08-26
  • 2011-10-19
  • 2018-09-02
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
相关资源
最近更新 更多