3

これが私が読んできたものです:

 http://www.postgresql.org/docs/9.2/static/rules-views.html
 http://www.postgresql.org/docs/9.2/static/rules-privileges.html

私の目標は、ログインが「所有する」行のみを表示できるようにすることです。

データベース内のすべてのテーブルがこのテーブルから継承されているとしましょう:

   create table WHOAMI
   ( 
      tenant varchar(25) not null default current_user
   );

例えば:

   create table FOO
   (
     id int primary key,
     invoicedate date
   ) inherits (WHOAMI);

    insert into FOO(id, invoicedate) values(1,now()::date);

    select * from FOO;

    --abclogin|1|2013-02-01

PostgreSQL には、スキーマ内のすべてのテーブルとビューに影響を与えるスキーマ レベルの選択規則のようなものがありますか..AND WHERE TENANT = current_user? そのようなグローバルなルールがない場合、テーブルごとに行うことはできますか? 私の試みは成功していません。おそらく、ルールの作成方法についていくつか誤解している可能性があります。これが私がやろうとしたことです:

選択ルールを作成しようとしています:

  CREATE RULE "_RETURN" AS ON SELECT TO FOO DO INSTEAD
  SELECT * FROM FOO where tenant = current_user;

しかし、このエラーが発生します:ERROR: could not convert table "foo" to a view because it has indexes

security-barrierを使用してビューを作成しようとしています:

       CREATE VIEW TENANTFOO WITH (security_barrier) AS
       SELECT * FROM FOO WHERE tenant=current_user;

次に、挿入を試みます。

        insert into TENANTFOO(id,invoicedate)
        values(2,(now()::date);

しかし、このエラーが発生します:

        `ERROR:  cannot insert into view "tenantfoo"
         HINT:  You need an unconditional ON INSERT DO INSTEAD rule
         or an INSTEAD OF INSERT trigger.`

テーブルに行レベルのセキュリティ バリアを実装するには、どのような手順が必要ですか?

4

2 に答える 2

2

INSERT 最後の例では、テーブルに対してを実行するか、別の RULE: を作成する必要がありますON INSERT TO TENANTFOO DO INSTEAD

于 2013-02-09T22:50:04.160 に答える
1

あなたが探しているのは行レベルのセキュリティです。これについてはいくつかの作業が行われていますが、まだ利用できません。このパッチが次の9.3リリースに組み込まれることを願っています。

その間、私は少し前に次のデザインを扱ってきました。

要件は同様でした。ビューは、を対象とした行のみを配信する必要がありましたCURRENT_USER。私たちの場合、アクセスは非常に単純でした。特定のユーザーが特定のリレーションと特定のキーにアクセスできるかどうかを指定するテーブル。

CREATE TABLE user_grants (
    user_id     integer,
    entity_name text, -- should exist in pg_class
    entity_id   integer
);

次に、について言うとtasks、次のビューが作成されました。

CREATE VIEW tasks_v AS
SELECT t.*
  FROM tasks t
  JOIN user_grants ug ON t.user_id = ug.user_id
   AND ug.entity_name='TASKS' AND ug.entity_id = t.task_id;

もちろん、多くのヘルパー関数、トリガー、およびルールがないと、セットアップは完了しません。また、いくつかの妥当なデフォルト特権が常に付与されていることを確認する必要がありました。

于 2013-02-09T23:15:12.123 に答える