🔰

【バイブコーディング】SupabaseデータベースとAIで「自分だけのデータ」を安全に扱う方法【RLS入門】

に公開

はじめに

こんにちは! 株式会社 OCT-PATHで CTO をしている黛 政隆(X はこちら)です。

最近は非エンジニアの方もプログラムに挑戦している人も多くなってきて、嬉しい限りです😊

前回の記事では、Supabase を使って驚くほど簡単に「Google ログイン機能」を実装する方法をご紹介しました。

ログイン機能が実装できると、次に作りたくなるのは「ログインしたユーザーさん一人ひとりが、自分のデータを保存したり、見返したりできる機能」ですよね。例えば、自分だけのメモ帳、自分だけのブックマークリスト、自分だけの投稿履歴など、アプリケーションの核となる部分です。

でも、ここで多くの人がふと、こんな不安を感じるはずです。

A さんのデータを、間違って B さんに見せてしまったらどうしよう…?
データベースのセキュリティなんて、専門的で難しそう…

その不安、とてもよく分かります。ユーザーの大切なデータを扱う以上、セキュリティは絶対に手を抜けません。しかし、ご安心ください!

今回は、この最も重要で、最も難しそうに見える「データアクセスの制御」を、AI の力を借りて驚くほど簡単に、そして安全に実現する方法を、世界一分かりやすく解説していきます。

この記事を読み終える頃には、「なんだ、セキュリティって怖くないじゃん!」と思っていただけるはずです。AI への「魔法の呪文(プロンプト)」もたくさん紹介するので、ぜひ最後までお付き合いください!

なぜ「認証」と「データベース」がセットだと嬉しいのか?

前回の記事でも触れましたが、Supabase がなぜこれほど便利なのか、その核心に触れておきましょう。それは、「認証(Auth)」と「データベース(Database)」の機能が、最初からがっちりタッグを組んでいるからです。

機能 役割
認証 (Authentication) 「この人は誰か?」を証明する(例: Google ログイン)
データベース (Database) 情報を整理して保存しておく箱

この 2 つが連携しているおかげで、「データベースにアクセスしてきたこの人は、ログインしている誰なのか?」を Supabase が自動で判断してくれます。この仕組みこそが、今回ご紹介する「Row Level Security (RLS)」の土台となるのです。

アプリ開発の心臓部「Row Level Security (RLS)」とは?

「RLS(アールエルエス)」という言葉、初めて聞いた方もいるかもしれませんね。
これは「行レベルセキュリティ」と訳され、その名の通り、データベースのテーブルの「行(Row)」ごとに、「誰が」「何をしていいか(読み取り、追加、更新、削除)」を設定できる、非常に強力なセキュリティ機能です。

言葉だけだと難しいので、マンションで例えてみましょう。

RLSがないマンション(誰でも入れてしまう…)
こちらの図は、セキュリティが全くない状態を表しています。ユーザーAさんもBさんも、お互いの部屋(データ)に自由に出入りできてしまい、非常に危険な状態です。

RLSがあるマンション(オートロックで安全!)
そしてこちらが、RLSを有効にした安全な状態です。マンションの入り口に「オートロック(RLS)」が設置され、ユーザーは自分の「鍵(ログイン情報)」で自分の部屋にしか入れません。

図で見てみると、RLS がいかに強力で、アプリケーションを安全に保つための「縁の下の力持ち」であるか、イメージが掴めたかと思います。

この「オートロック」の仕組みがあるおかげで、開発者である私たちは、
「このデータは A さんのものだから、A さんにだけ見せる…」
といった複雑なセキュリティのロジックを、アプリケーションのコードに毎回書く必要がなくなるのです。

さあ、理屈はここまでにして、早速 AI と一緒にこの安全な「マンション」を建てていきましょう!
まずは、ユーザーのデータ(TODO)を保存するための「部屋」、つまりデータベースのテーブルを設計するところから始めます。

STEP 1: AI と一緒にテーブルを設計しよう!

理屈はこれくらいにして、早速 AI と一緒に手を動かしていきましょう!
今回は、シンプルな「TODO アプリ」を題材にします。

まずは、TODO を保存するためのテーブルが必要です。どんなカラム(列)が必要か、AI に聞きながら設計してみましょう。

今回は、VSCode や Cursor のような AI コーディングツールを使っている前提で進めます。

🤖 AI への魔法の呪文 (プロンプト) 例 1

Supabase で、シンプルな TODO アプリのデータベーステーブルを設計したいです。
テーブル名は todos としてください。

必要なカラムは以下の通りです。

  • id: 主キーで、自動で連番が振られるように。
  • user_id: 誰の TODO かを識別するためのもの。これはログインしているユーザーの ID と紐付けたいです。型は uuid にしてください。
  • task: TODO の内容を保存するテキスト。
  • is_completed: 完了したかどうかを示す真偽値。デフォルトは false にしたいです。
  • created_at: 作成日時を記録するタイムスタンプ。

この要件で、テーブルを作成するための SQL 文を生成してください。user_id は、Supabase の認証ユーザー (auth.users) を参照する外部キーとして設定してください。

すると、AI はおそらくこのような SQL を返してくれるはずです。

-- todos テーブルを作成
CREATE TABLE public.todos (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  user_id UUID REFERENCES auth.users(id) NOT NULL,
  task TEXT,
  is_completed BOOLEAN DEFAULT FALSE NOT NULL,
  created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
);

-- user_id カラムにインデックスを作成して検索を高速化
CREATE INDEX todos_user_id_idx ON public.todos(user_id);

すごいですよね!こちらの要望を完璧に理解し、外部キーの設定や、検索を速くするためのおまじない(インデックス作成)まで提案してくれています。

この SQL が手に入ったら、あとは Supabase の管理画面にログインし、左メニューの SQL Editor > New query を選んで、この SQL を貼り付けて RUN をクリックするだけ。

(ここに AI が作った SQL を貼り付けて実行するだけ!)

これで、あなたの Supabase プロジェクトに todos テーブルが爆誕しました!

STEP 2: AI に「魔法のルール (RLS)」を作ってもらおう!

テーブルができたので、いよいよこの記事の核心である RLS を設定します。
難しそう…」と身構える必要は一切ありません。ここも AI にお任せです!

🤖 AI への魔法の呪文 (プロンプト) 例 2

先ほど作成した Supabase の todos テーブルに、Row Level Security (RLS) を設定したいです。

以下の 4 つの操作(SELECT, INSERT, UPDATE, DELETE)に対して、それぞれポリシーを作成してください。

要件:

  • 自分の TODO しか見れない (SELECT)
  • 自分用の TODO しか追加できない (INSERT)
  • 自分の TODO しか更新できない (UPDATE)
  • 自分の TODO しか削除できない (DELETE)

すべてのポリシーで、行の user_id カラムと、現在ログインしているユーザーの uid が一致することを条件にしてください。
このための SQL ポリシーをすべて生成してください。

このプロンプトのミソは、「auth.uid() を使ってね」と直接言わずに、「ログインしているユーザーの uid と user_id を比較してね」と役割を伝えるだけで、AI がそれを汲み取ってくれる点です。

AI は、以下のような完璧な回答を返してくれるでしょう。

-- まず、todos テーブルで RLS を有効化します
ALTER TABLE public.todos ENABLE ROW LEVEL SECURITY;

-- 1. 自分のTODOのみをSELECT(閲覧)できるポリシー
CREATE POLICY "Allow individual select access"
ON public.todos FOR SELECT
USING (auth.uid() = user_id);

-- 2. 自分のTODOのみをINSERT(追加)できるポリシー
CREATE POLICY "Allow individual insert access"
ON public.todos FOR INSERT
WITH CHECK (auth.uid() = user_id);

-- 3. 自分のTODOのみをUPDATE(更新)できるポリシー
CREATE POLICY "Allow individual update access"
ON public.todos FOR UPDATE
USING (auth.uid() = user_id);

-- 4. 自分のTODOのみをDELETE(削除)できるポリシー
CREATE POLICY "Allow individual delete access"
ON public.todos FOR DELETE
USING (auth.uid() = user_id);

【少しだけ深掘り】この SQL は何をしているの?

AI が作ってくれたこの SQL、まさに魔法のようですが、何をしているか少しだけ覗いてみましょう。

  • ALTER TABLE ... ENABLE ROW LEVEL SECURITY;
    • todos テーブルで RLS(オートロック)を有効にします!」という宣言です。
  • CREATE POLICY "ポリシー名" ...
    • 具体的なルールを作っています。
  • USING (auth.uid() = user_id)
    • これが 一番のキモ です!
    • auth.uid() というのは、「今まさにデータベースにアクセスしている、ログイン中のユーザーの ID」を自動で取得してくれる Supabase の特殊な関数です。
    • つまり、「行の user_id と、ログイン中のユーザー ID が同じだったら操作を許可します」という、最強の条件文なのです。

この SQL も、先ほどと同じように Supabase の SQL Editor で実行すれば、セキュリティ設定は完了です。簡単すぎて、本当に設定できたか不安になるくらいですよね(笑)。

STEP 3: AI にフロントエンドの実装もお願いしよう!

バックエンドの準備は万端です。
最後に、この安全なデータベースを使って、TODO を一覧表示したり、新しく追加したりするフロントエンドの機能を AI に作ってもらいましょう。

🤖 AI への魔法の呪文 (プロンプト) 例 3

Next.js と Supabase を使って、TODO アプリのフロントエンドを実装してください。

要件:

  1. Supabase client はすでにセットアップ済みです。
  2. todos テーブルから、ログインしているユーザーの TODO データをすべて取得して一覧表示するコンポーネントを作成してください。
  3. 新しい TODO を追加するための入力フォームと追加ボタンを設置してください。
  4. ボタンをクリックしたら、入力された内容を todos テーブルに INSERT する処理を実装してください。

RLS は設定済みなので、特別なユーザーIDの指定は不要なはずです。シンプルで分かりやすいコードを生成してください。

すると、AI はこのように非常にシンプルなコードを生成してくれます。

import { supabase } from './supabaseClient'; // Supabaseクライアントをインポート

// TODO一覧を取得する関数
async function fetchTodos() {
  // RLSのおかげで、これだけで自分のデータだけが返ってくる!
  const { data: todos, error } = await supabase
    .from('todos')
    .select('*')
    .order('created_at', { ascending: false });

  if (error) console.error('Error fetching todos:', error);
  else console.log('My Todos:', todos);
}

// 新しいTODOを追加する関数
async function addTodo(taskText) {
  // user_id は Supabase が自動で付与してくれる!
  const { data, error } = await supabase
    .from('todos')
    .insert([{ task: taskText }])
    .select();

  if (error) console.error('Error adding todo:', error);
  else console.log('Added new todo:', data);
}

このコードの美しい点は、where('user_id', '=', 'ログイン中のユーザーID') のような条件がどこにも書かれていないことです。
それでも、裏側で RLS が「このリクエストは A さんからだな。じゃあ A さんのデータだけを返そう」と完璧に仕事をしてくれるのです。

開発者はセキュリティのことを過度に意識せず、やりたいこと(データを取る、入れる)に集中できる。これが Supabase と RLS がもたらす最高の開発体験です。

おわりに

いかがだったでしょうか?

「データベースのセキュリティ」という、一見すると専門的で難解なテーマも、Supabase のようなモダンなサービスと、Claude のような優秀な AI を組み合わせることで、まるでプラモデルを組み立てるかのように、楽しく、そして安全に実装できることがお分かりいただけたかと思います。

難しい部分は AI に任せ、人間は「何を作りたいか」「どうあるべきか」という本質的な設計に集中する。

これこそが、これからの「バイブコーディング」の真髄であり、個人開発やスタートアップが高速でプロダクトを生み出すための鍵となります。今回紹介した RLS は、ユーザーデータを扱うアプリケーションを作る上での「最低限のマナー」とも言える重要な機能です。ぜひ、AI という最高の相棒と一緒に、この強力な武器を使いこなしてみてください。

皆さんのアイデアが、安全な形で次々と世の中に生まれていくことを心から願っています。

Happy Hacking!!🐙


最後に、少しだけ宣伝をさせてください 🙏

AI・Web3 開発サービス

弊社 OCT-PATH は、最先端の AI 技術を活用し、高品質かつ短納期での開発サービスを提供しております。特に AI・Web3 領域において豊富な実績と専門性を有しており、お客様のデジタルトランスフォーメーションを強力にサポートいたします。

サービスにご関心をお持ちの企業様は、ぜひ弊社ホームページよりお気軽にお問い合わせください。

NeoTechPark コミュニティ連携

弊社が運営するエンジニアコミュニティ「NeoTechPark」には、優秀なインドネシアの若手エンジニアが多数参加しており、活発な技術交流が行われております。

現在、企業様との共同ハッカソン開催による人材発掘・技術交流の取り組みを積極的に推進しております。特に昨今注目を集めている AI エージェントの構築をはじめ、最新の AI 技術を活用したソリューション開発に焦点を当てたイベントの企画・運営が可能です。

グローバル人材との協業や次世代 AI 技術の実用化にご興味のある企業様は、ぜひお声がけいただければ幸いです。


お問い合わせ・ご相談は弊社ホームページよりお待ちしております。

Discussion