【ぎょうれべるせきゅりてぃ】

行レベルセキュリティ(RLS) とは?

最終更新:
💡 同じテーブルでも、アクセスできる行をルールで制限

テーブル内のどの行を読み取り・追加・更新・削除できるかを、利用者や操作に応じたルールで制御するデータベース機能。適用条件と例外は製品や設定によって異なる。

📌 このページのポイント
行のアクセス条件をDBで確認 利用者A 注文テーブル Aの注文 許可 Bの注文 対象外 Aの注文 許可 ポリシー 例:自分の注文だけを読める条件 権限・操作・適用の例外も確認
行の条件は、利用者・操作・権限に応じて設計する。管理者やテーブル所有者などの例外は製品と設定による。
ひよこ ひよこ
行レベルセキュリティって、何を制限するの?
ペンギン先生 ペンギン先生
同じテーブルの中でも、どの行へアクセスできるかを制限するよ。たとえば注文データで、自分の注文だけを読めるルールを作る。テーブル全体へのアクセス権限と、各行への条件を合わせて管理するんだ。
ひよこ ひよこ
アプリ側でWHEREを書けば同じことができる?
ペンギン先生 ペンギン先生
アプリでも絞り込めるけれど、条件を書き忘れる可能性があるね。RLSの対象となるアクセスなら、DB側で条件を適用できる。ただし「どんなクエリでも必ず制限される」とは限らないので、接続する権限や操作を確認しよう。
ひよこ ひよこ
PostgreSQLではどう設定するの?
ペンギン先生 ペンギン先生
対象テーブルでRLSを有効にし、CREATE POLICYで対象のロール・操作・行の条件を設定するよ。対象のアクセスに許可ポリシーがなければ、既定では行のアクセスを拒否する。条件を書くことに加えて、誰として接続するかを確かめる必要があるんだ。
ひよこ ひよこ
管理者でも必ず同じ制限を受ける?
ペンギン先生 ペンギン先生
PostgreSQLのスーパーユーザーやBYPASSRLSの権限を持つロールは、RLSを回避するよ。テーブル所有者も通常は対象外で、FORCE ROW LEVEL SECURITYで対象にできる。TRUNCATEなどテーブル全体への操作もRLSの対象ではないんだ。
ひよこ ひよこ
読み取りを制限すれば、書き込みも安全?
ペンギン先生 ペンギン先生
読み取りに加え、追加・更新・削除のルールも設計しよう。PostgreSQLではUSINGが既存の行への条件、WITH CHECKが追加や更新後の行への条件に関わる。利用者を示す値を信頼できる方法で渡し、別の利用者の行を読めない・変更できないことを確認するんだ。
ひよこ ひよこ
Supabaseでも使える?遅くなる?
ペンギン先生 ペンギン先生
SupabaseはPostgreSQLのRLSと認証を組み合わせられるよ。auth.uid()で要求した利用者のIDを参照する例があるけれど、ポリシーや権限の設定は必要だね。評価する条件やデータ量で性能も変わるので、インデックスなどを検討して実際の処理を測ろう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「行レベルセキュリティ(RLS)」って出てきたら「アクセスできる行を、DB側のルールで制限する機能」と思えばだいたいOK!
📖 おまけ:英語の意味
「Row-Level Security」 = 行レベルセキュリティ
💬 Row(行)+Level(レベル)+Security(セキュリティ)。テーブルの行という細粒度でアクセス制御をかける仕組みだよ

参考資料

← 用語集にもどる