postgresql - 从继承的角色中撤销 SELECT

标签 postgresql roles user-permissions postgresql-9.4 sql-grant

我在获得按我希望的方式工作的权限时遇到了一个小问题。

我有一个通常应该被允许在任何地方进行 SELECT 的角色,这个角色有很多成员。不应允许其中一个从某个表中进行选择。

我认为这可以通过向普通读者角色授予角色成员身份并从受限表中撤销 SELECT 来实现。

似乎父角色的权限适用,而不是特定权限。有没有办法解决这个问题而不必维护更受限制的角色的权限,或者我是否以错误的方式在 PostgreSQL 中应用了角色概念?

这是一个示例脚本:

-- as superuser
CREATE DATABASE permission_test;

\c permission_test

CREATE ROLE r_general_select;
CREATE ROLE r_restricted_select IN ROLE r_general_select;

-- set the default permissions
ALTER DEFAULT PRIVILEGES IN SCHEMA "public" GRANT SELECT ON TABLES TO "r_general_select";

CREATE TABLE "open"(
    id SERIAL,
    payload TEXT
);
insert into "open"(payload) values ('test');

-- covered by default privileges
GRANT SELECT ON "open" TO PUBLIC;

-- Tests
-- this is good
SET ROLE r_general_select;
SELECT * FROM "open";
RESET ROLE;

-- this is good
SET ROLE r_restricted_select;
SELECT * FROM "open";
RESET ROLE;

CREATE TABLE "restricted" (
    id SERIAL,
    payload TEXT
);
insert into "restricted"(payload) values ('test');

-- the role and it's members should be able to read
GRANT SELECT ON "restricted" TO r_general_select;
-- except for this one!
REVOKE SELECT ON "restricted" FROM r_restricted_select;

-- Tests
-- this is good
SET ROLE r_general_select;
SELECT * FROM restricted;
RESET ROLE;

-- this should barf with a permission violation
SET ROLE r_restricted_select;
SELECT * FROM restricted;
RESET ROLE;

--- CLEANUP
DROP OWNED BY "r_restricted_select" CASCADE;
DROP ROLE r_restricted_select ;
DROP OWNED BY "r_general_select" CASCADE;
DROP ROLE r_general_select ;

最佳答案

在 PostgreSQL 中,角色权限是纯粹附加的。在这样的模型中,无法从继承角色的后代撤消对继承角色授予的权限。

要解决此问题,您需要更改您的权限方法并将其基于总是一起出现的权限。我通常通过同时查看功能依赖性和操作依赖性来做到这一点。

关于postgresql - 从继承的角色中撤销 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37806190/

相关文章:

macos - PostgreSQL 服务器不会在 Lion (Mac OS 10.7) 上关闭

sql - GROUP BY 本身就意味着 DISTINCT 吗?

Symfony2 : Storing users, 角色、角色层次结构和数据库中的访问控制

PHP 无法在 Mac 上写入 sys_get_temp_dir()

PostgreSQL 本地时间

.net - SQL 成员资格/角色提供程序的 DDL

c# - 基于客户端特定角色的身份验证?

linux - 如何允许 Bob 安全地读取/var/log/中的某些文件?

java - 如何获得管理权限以在java中打开Windows vista/7 C盘中的目录

python - 查询后可以过滤查询集吗? Django