はじめに
Baas(Backend As A Service)で何かサービスを構築してみたいと思い、
firebaseを触ってみようと思ったところ、Firebase の代替と謳われているsupabaseを発見。
こちらの方が面白そうだと感じたため、構築してみることに
使ったもの
-
Vite + Svelte + Typescript
- @supabase/supabase-js
- tailwind css
-
supabase
- auth
- db
- realtime
これまで
-
フロント側でsupabaseを呼び出せるところように
-
データ取得・操作
tasksテーブル
項目 | 型 |
---|---|
id | uuid |
user_id | uuid |
content | text |
is_done | boolean |
created_at | date |
前回まででこのテーブルからTodoの取得や新規登録ができるようになった。
今回
前回まででデータの取得・操作が行えるようになったが、
このままだと自分が作ったTodo以外まで取得・操作できてしまうため、
自分が作ったものだけを操作できるようなポリシーの設定をしていく。
1. RLS(Row Level Security)の有効化
- サイドメニューより、
Authentication
タブを開く -
Policies
を選択し、tasks
テーブルEnable RLS
からRLSを有効化する - テーブル名の隣に
RLS enabled
となっていたら有効化になっている。
2. Policy作成
このままだと誰も閲覧・操作できないので、
例として、自分のTodoのみ閲覧可能
にするようなポリシーを設定してみる。
-
New Policy
からポリシーを設定する - テンプレートはいろいろ用意されているが、今回は
For full customization
を選択。 -
Policy name
には分かりやすい名前を設定。(日本語OK) -
Allowed operation
はSELECT
を選択 -
Target roles
はログイン済みのユーザーのみにしたいため、authenticated
を選択 -
USING expression
にはどういった条件を満たした時に、というものを記述する。
今回の場合は、ログインしてアクセスしてきているユーザーauth.uid()と、
tasksテーブルのuser_idが一致しているという条件にしたいため、
auth.uid() = user_id
と記述すればOK。
これを設定ことで自分のタスクのみ閲覧することができるようになるため、
↓のようにフロント側でわざわざ条件を付ける必要がない。
const listTodo = async () => {
const user_id = session.user.id
const query = supabase
.from('tasks')
.select()
.match({'user_id': user_id}) // ユーザーIDで絞り込み
const { data, error } = await query
}
同様にINSERT UPDATE DELETEに関してもポリシーを設定し、
自分のTodoしか閲覧・操作できないようにすることができた。
ここまででもTodoアプリとしては機能するが、共同作業などを行っているときは、
他の人が作成したTodoが即座に自分の画面に表示された方が都合がいい場合が多い。
次回はリアルタイム機能を使って、DBの操作が行われたときに、
即座に画面に反映されるようにしていく。
supabase、とってもいい感じですね