行レベルセキュリティ(RLS)
PostgreSQL の行レベルセキュリティ(RLS)とは?
行レベルセキュリティを使うと、CREATE POLICY で作成したポリシーにより、各ロールがどの行を参照・変更できるかをテーブルが行単位で決められます。
行レベルセキュリティ(RLS)は、クエリが返したり変更したりできる行を、ロールごとに制限する機能です。テーブルに対して ALTER TABLE ... ENABLE ROW LEVEL SECURITY で有効化し、CREATE POLICY でポリシーを追加します。ポリシーの USING 式はロールが参照できる行を絞り込み、WITH CHECK 式は新規の行や更新後の行を許可するかどうかを決めます。
RLS が有効で適用されるポリシーがない場合、PostgreSQL はデフォルト拒否のポリシーを使います。つまり、どの行も参照・変更できません。スーパーユーザーと BYPASSRLS 属性を持つロールは常に行セキュリティをバイパスし、テーブルの所有者も、テーブルに FORCE ROW LEVEL SECURITY が設定されていない限り通常はバイパスします。ポリシーのテストは、アプリケーションが実際に接続に使うロールで行ってください。
例
この例では、テーブルの RLS を有効化し、owner 列を current_user と比較するポリシーを追加して、ロール alice としてテーブルをクエリします。返ってくるのは alice の行だけです。セットアップは RLS をバイパスするスーパーユーザーで実行するため、最後のクエリの前にロールを切り替えています。
CREATE TABLE notes (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
owner text NOT NULL,
body text NOT NULL
);
INSERT INTO notes (owner, body) VALUES ('alice', 'hello'), ('bob', 'hi');
ALTER TABLE notes ENABLE ROW LEVEL SECURITY;
CREATE POLICY notes_owner ON notes USING (owner = current_user);
CREATE ROLE alice;
GRANT SELECT ON notes TO alice;
SET ROLE alice;
SELECT * FROM notes;
RESET ROLE;拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。
出典
PostgreSQL 公式ドキュメント(英語)。