Web アプリケーションをサポートするマルチテナント データベースで新しい行レベル セキュリティ機能を使用する最善の方法を把握しようとしています。
現在、アプリケーションは、実行しようとしているアクションに応じて、いくつかの異なる ROLE を使用できます。
アプリケーションが独自の ROLE を使用して接続を確立すると、アプリケーションは (ユーザーによって提供された) 認証パラメーターをさまざまな関数に渡します。この関数は、ユーザーが提供した認証パラメーターに基づいて行をフィルター処理します。このシステムは、何千人ものユーザーと連携するように設計されており、機能しているようです。ただし、それは反抗的に不格好です(そして遅いです)。
新しい行レベル セキュリティ機能を使用したい場合、(Web アプリケーションだけでなく) 実際のユーザーごとに新しい ROLE を作成して、データベースにアクセスする必要があるようです。
これは正しいです?もしそうなら、データベースに何千もの ROLE を作成するのは良い考えですか?
コメント内のa_horse_with_no_nameのリンクから更新します (ありがとう、そのスレッドはスポットです):
CREATE USER application;
CREATE TABLE t1 (id int primary key, f1 text, app_user text);
INSERT INTO t1 VALUES(1,'a','bob');
INSERT INTO t1 VALUES(2,'b','alice');
ALTER TABLE t1 ENABLE ROW LEVEL SECURITY;
CREATE POLICY P ON t1 USING (app_user = current_setting('app_name.app_user'));
GRANT SELECT ON t1 TO application;
SET SESSION AUTHORIZATION application;
SET app_name.app_user = 'bob';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
1 | a | bob
(1 row)
SET app_name.app_user = 'alice';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
2 | b | alice
(1 row)
SET app_name.app_user = 'none';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
(0 rows)
current_setting('app_name.app_user')
さて、これは構成パラメーター専用であるという印象を受けていたので、混乱しています...どこでapp_name
定義されていますか?