私はそれらが欲しい方法で動作するように権限を取得することに若干の問題があります。継承されたロールから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 ;
シュート!私はこれが当てはまると思ったが、ドキュメントの中でそれに対する参照を見つけることができなかった。まあ、引き抜きボードに戻って... – serverhorror