PostgreSQL没有递归撤销角色

时间:2015-07-04 08:41:41

标签: sql database postgresql postgresql-9.4

我在Windows 7 SP1 64bit上使用PostgreSQL 9.4,在撤销角色时遇到问题。 让我们说我有三个用户:泰勒,米歇尔和超级用户postgres。 作为postgres,我授予角色'utente'使用管理员选项

$(document).ready(function () {
    $(".thehide").hide();
    $(".datepicker").datepicker({dateFormat: "yy-mm-dd"});
    $(".filter_pages").unbind().click(function (e) {
        $(this).next(".filter_sub").stop(true).slideToggle();
        e.preventDefault();
    });
    $(document).mouseup(function (e) {
        var container = $(".filter_sub");
        var calendar = $(".ui-datepicker");
        if (!container.is(e.target) && calendar.has(e.target).length === 0 && container.has(e.target).length === 0) {
            container.stop(true).slideUp();
        }
    });
});

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

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:0)

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

根据documentation

  

用户只能撤消该用户直接授予的权限。例如,如果用户A已向用户B授予了具有grant选项的权限,并且用户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错误邮件列表报告。