2016-06-14 6 views
3

원하는 방식대로 작동하도록 사용 권한을 얻는 데 약간의 문제가 있습니다.상속 된 역할에서 SELECT를 취소하십시오.

나는 일반적으로 모든 곳에서 SELECT 할 수있는 역할을 가지고 있으며,이 역할에 많은 멤버가 있습니다. 그들 중 하나는 특정 테이블에서 선택하도록 허용되어서는 안됩니다.

일반적인 리더 역할에 역할 구성원 자격을 부여하고 제한된 테이블에서 SELECT를 취소하면 이것이 가능할 것으로 생각했습니다.

상위 역할의 권한이 적용되고 특정 권한이 아닌 것으로 보입니다. 좀 더 제한된 역할의 권한을 유지할 필요없이이 문제를 해결할 수있는 방법이 있습니까? 아니면 PostgreSQL에서 역할 개념을 잘못된 방식으로 적용하고 있습니까?

이 다음은 샘플 스크립트입니다 : 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 ; 

답변

2

, 역할 권한은 순수 첨가제입니다. 그러한 모델에서 상속 된 것에 대해 부여 된 권한을 상속받은 역할을 후손으로부터 취소 할 수있는 방법이 없습니다.

이 문제를 해결하려면 항상이 함께 발생하는 사용 권한 접근 방식을 변경해야합니다. 필자는 일반적으로 기능적 종속성과 운영 종속성을 함께 조사하여이 작업을 수행합니다.

+0

촬영! 나는 이것이 사실이라고 생각했지만 문서에서 그것에 대한 참조를 찾을 수 없었다. 그럼 다시 드로잉 보드에 ... – serverhorror