Skip to content

SupabaseのRow Level Securityをクラウドと設計する

SupabaseのRLS(Row Level Security)は、データベースレベルでアクセス制御を実現する強力な仕組みです。しかし、ポリシーの設計ミスはセキュリティホールに直結します。今回はClaude Codeを活用して、安全かつ効率よくRLSポリシーを設計する方法を紹介します。

RLSポリシーの設計をClaude Codeに依頼する

Section titled “RLSポリシーの設計をClaude Codeに依頼する”

まずはプロジェクトのスキーマをClaude Codeに渡して、ポリシーの叩き台を作ってもらいましょう。以下のように入力すると効果的です。

以下のSupabaseテーブル定義に対して、RLSポリシーを設計してください。
要件:
- ユーザーは自分のデータのみ読み書き可能
- 管理者ロール(role = 'admin')はすべてのデータを参照可能
- 削除は管理者のみ許可
テーブル: posts (id, user_id, content, created_at)

Claude Codeはこの指示から、auth.uid()auth.jwt()を使った具体的なSQLを生成してくれます。生成されたポリシーをそのまま使うのではなく、「なぜこの条件式なのか」を必ず確認するようにしましょう。

スキーマ: データベースのテーブル構造や型定義のこと。

生成されたポリシーをレビュー・修正する

Section titled “生成されたポリシーをレビュー・修正する”

Claude Codeが出力するポリシーの例はこのようなものです。

-- ユーザーは自分のpostsのみ操作可能
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;
CREATE POLICY "users_own_posts" ON posts
FOR ALL
USING (auth.uid() = user_id);
-- 管理者はすべてのpostsを参照可能
CREATE POLICY "admin_read_all" ON posts
FOR SELECT
USING (auth.jwt() ->> 'role' = 'admin');

このSQLをSupabase SQLエディタに貼り付ける前に、Claude Codeへ「このポリシーに抜け穴がないか確認して」と追加で依頼することをおすすめします。たとえばINSERT時にuser_idが改ざんされるリスクや、JWTクレームの検証漏れを指摘してくれます。

JWT: JSON Web Token の略。ユーザー認証情報をJSON形式でエンコードしたトークン。ヘッダーに付けてAPIを呼び出す際に使う。

マイグレーションファイルへの組み込み

Section titled “マイグレーションファイルへの組み込み”

ポリシーが確定したら、Supabase CLIのマイグレーションとして管理しましょう。

Terminal window
supabase migration new add_rls_policies
# supabase/migrations/20240101000000_add_rls_policies.sql に出力されたSQLを貼り付け
supabase db push

このフローをClaude Codeに伝えておくと、「マイグレーションファイル形式で出力して」と一言添えるだけで、そのまま使えるファイルを生成してくれるようになります。RLS設計はセキュリティの要です。Claude Codeを「設計パートナー」として活用し、レビューと検証を徹底して進めましょう。

マイグレーション: データベースのスキーマ(テーブル構造)を安全に変更するための手順書。CLI: Command Line Interface の略。ターミナル(黒い画面)からコマンドを入力して操作するインターフェース。