【Supabase × Prisma 入門】データベース作成・ローカル接続・RLS 対応

### はじめに

最近では、Firebase のような BaaS（Backend as a Service）を活用して、素早くバックエンド機能を構築する開発スタイルが注目されています。中でも Supabase は、「オープンソースの Firebase 代替」として人気を集めているサービスで、PostgreSQL ベースのデータベース、認証、ストレージ、リアルタイム機能などを備えています。

本記事では、Supabase を使ってデータベースを作成し、Prisma を通じてローカル環境から接続する手順を解説します。さらに、Supabase のセキュリティ機能である **Row Level Security（RLS）** の設定方法についても触れていきます。

#### 本記事で想定するプロジェクト

- Node.js/Express でバックエンド API を作成
- DB 操作に Prisma を使用している

## アカウント作成

1. [Supabase 公式サイト](https://supabase.com/)にアクセスします。

2. 右上の「signIn」ボタンを押下します。

3. ページ下部に「Sign Up Now」というリンクがあるので、アカウント未作成の方はこちらから進めてください。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665246/0ca4208b-3821-47c4-9660-bf6baa13896b.png)

4. 初回ログイン時に組織（Organization）の情報を求められるので、「Personal（個人）」と「free（無料）」プランで進めます。

## データベース作成／接続

1. ダッシュボードから「New Project」を選択し、プロジェクトを作成します。

2. 作成後、ヘッダーの「Connect」ボタンを押下します。

    ![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665246/b81953be-234f-46f9-aa22-1035545c4fa0.png)

3. 今回は Prisma を使用しているので、「ORMs」タブを選択します。

    ![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665246/80e69702-84e6-4505-b67d-d89524c479c6.png)

4. `.env` と `schema.prisma` ファイルの設定内容が表示されるので、コピーしてローカル環境で設定します。`[YOUR-PASSWORD]` の箇所はプロジェクト作成時に設定したデータベースパスワードを設定してください。（※ `[]` は不要です）

5. `prisma/migrations` フォルダがすでに存在する場合は削除します。

    ![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665246/201be5cf-c0e1-4a7d-91fe-315f799a398d.png)


6. 以下のコマンドを実行し、テーブルを作成します。

    ```bash
    npx prisma migrate dev --name init
    ```
    
    Supabase のサイドバーから「Database」を選択し、テーブルが作成されたことを確認します。
    ![image-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665246/0bb67cdd-9aee-4e58-852b-b2f9d1102cd6.png)

    
    ここまでの設定で、ローカル環境で使っていたデータベースと同様の操作が可能となります。

7. （任意）シードスクリプトを使って、ダミーデータを挿入します。詳細は以下の記事をご参照ください。

https://qiita.com/m-bitterC2/items/63607378efb0cedcabcd#3-%E3%82%B7%E3%83%BC%E3%83%89%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%83%80%E3%83%9F%E3%83%BC%E3%83%87%E3%83%BC%E3%82%BF%E6%8C%BF%E5%85%A5

## RLS（行レベルセキュリティ）の警告について

テーブルを作成すると、Security Advisor に次の警告が出ます。

```log
RLS Disabled in Public

Issue
Table is public, but RLS has not been enabled.
```

（訳：テーブルは公開されていますが、RLS が有効になっていません。）

この警告は、テーブル内のデータへの無制限のアクセスが許可されている（PostgREST に公開されているスキーマのテーブルで行レベルのセキュリティ (RLS) が有効になっていない）ことを意味します。

クライアントから直接 DB や REST にアクセスする構成でない（= PostgREST や GraphQL を使う予定がない）場合、テーブルで RLS を有効にし、RLS ポリシーを何も作成しないことで、セキュリティを高められます。

Prisma を使用する場合は Supabase の PostgreSQL に直接接続しているため、RLS や PostgREST の影響を受けません。

## RLS（行レベルセキュリティ）の警告への対処法

PostgREST や GraphQL を使う予定がない場合、それらを無効化することで不要な攻撃面（REST API 経由の DB アクセス）を排除できます。

以下の対応を行います。

| 項目      | 対応                                |
| --------- | ----------------------------------- |
| PostgREST | RLS を有効化＋無ポリシーで封じる    |
| GraphQL   | スキーマ/テーブル権限を剥奪して遮断 |

#### PostgREST を無効化する

1. Supabase のプロジェクト画面で、サイドバーの「SQL Editor」を選択します。

2. 「New SQL Snippet」を押下し、エディタを開きます。
    
    ![image-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665246/9f60908c-3597-431d-904a-1c14bcc3be70.png)

3. RLS を有効化する SQL を実行します。
    
    ```sql
    -- RLSを有効化
    ALTER TABLE public.[テーブル名] ENABLE ROW LEVEL SECURITY;
    
    -- ポリシーは何も設定しない
    ```

- public スキーマのテーブルすべてに RLS を有効化
- RLS ポリシーを何も作成しない（デフォルトで拒否）

このように設定することで、実質的に PostgREST を無効化することができます。

#### GraphQL を無効化する

Supabase では、PostgREST や GraphQL は `anon`/`service_role` などの API キーでのアクセスを通じて使われます。

Supabase の GraphQL は graphql.public エンドポイントとして動作するため、実質的に無効化するには public スキーマの GraphQL 閲覧権限を取り除く（anon, service_role からの接続遮断）対応が必要です。

以下のコマンドを実行します。

```sql
REVOKE USAGE ON SCHEMA public FROM anon;
REVOKE USAGE ON SCHEMA public FROM service_role;
```

### （補足）

- Supabase の無料プランは、プロジェクトを２つしか作成できません。
- 将来的に REST API 接続が必要になった場合は、権限をもとに戻してお使いください。