投稿日:2026/5/9
更新日:2026/5/9

認可ミスは重大な情報漏えいにつながります。
特に「組織ごとにデータを分ける」SaaSでは、1件の漏れでも大きな問題です。
その対策として強力なのがRLS(Row Level Security)です。
行ごとに、誰がアクセスできるかをDB側で制御する仕組みです。
アプリ側で WHERE organization_id = ... を書き忘れても、
RLSがあればDBがアクセスをブロックできます。
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
CREATE POLICY order_owner_policy ON orders
USING (user_id = current_setting('app.user_id', true)::uuid);
これで SELECT * FROM orders を実行しても、ログイン中ユーザー本人の注文だけ返るようになります。
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;
CREATE POLICY draft_owner_policy ON posts
USING (
status = 'published'
OR author_id = current_setting('app.user_id', true)::uuid
);
この場合、公開投稿は全員が見られますが、下書きは投稿者本人だけが見られます。
tenant_id, user_id, author_id)にインデックスを貼るポリシーはシンプル + インデックス前提が安全です。
RLSは、認可の最終防衛ラインです。
アプリ実装ミスを補う意味でも、マルチテナントでは導入価値が高いです。