2016-06-14 8 views
3

私はそれらが欲しい方法で動作するように権限を取得することに若干の問題があります。継承されたロールからSELECTを取り消します。

私は、一般にどこでもSELECTすることが許可されるべき役割を持っています。この役割にはたくさんのメンバーがいます。それらの1つは、特定のテーブルから選択することを許可すべきではありません。

一般的な読者の役割にロールメンバーシップを付与し、制限されたテーブルから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

関連する問題