7

私には、スーパーユーザー、パワーユーザー、ユーザーの3つの役割があります。テーブル「data」と関数data_selectおよびdata_insertがあります。

ここで、スーパーユーザーのみがテーブル「データ」にアクセスできることを定義したいと思います。パワーユーザーとユーザーは、テーブル「データ」に直接アクセスすることはできませんが、関数を介してのみアクセスできます。

ユーザーは関数data_selectのみを実行でき、poweruserはdata_selectとdata_insertの両方を実行できます。

したがって、ユーザーalice、bob、...を作成し、userまたはpoweuserの特権を継承できます。

これは実際に達成可能ですか?私は2日目にこれと戦っていて、どこにも行きません。

お時間をいただきありがとうございます。

4

1 に答える 1

8

はい、これは可能です。

デフォルトでは、「スーパーユーザー」は実際のsuperuserですpostgres。プレーン ユーザーのロールの名前を に変更します。予約語であるusrため、識別子として使用しないでください。user

CREATE ROLE usr;
CREATE ROLE poweruser;
GRANT usr TO poweruser;  -- poweruser can do everything usr can.

CREATE ROLE bob PASSWORD <password>;
GRANT poweruser TO bob;

CREATE ROLE alice PASSWORD <password>;
GRANT usr TO alice;

REVOKE ALL ON SCHEMA x FROM public;
GRANT USAGE ON SCHEMA x TO usr;

REVOKE ALL ON TABLE x FROM public;
REVOKE ALL ON TABLE y FROM public;

CREATE FUNCTION
  ...
SECURITY DEFINER;

REVOKE ALL ON FUNCTION ... FROM public;
GRANT EXECUTE ON FUNCTION a TO usr;
GRANT EXECUTE ON FUNCTION b TO poweruser;

または、ログインなしでデーモン ロールを作成して、機能を所有し、テーブルに対するそれぞれの権利を保持することもできます。そのほうが安心でしょう。

この方法を使用する場合は、気に入る ALTER DEFAULT PRIVILEGESはずです(PostgreSQL 9.0 で導入)。この関連する回答の詳細

マニュアルの関数の安全な記述の章を読んでくださいSECURITY DEFINER

于 2012-02-12T11:40:11.920 に答える