Supabase の RLS ハマりポイントやっと解決
冬の LaunchWeek で
pg_crdt が紹介されてから、
yjs と Supabase Realtime のつなぎこみを思い出しては試行錯誤していた
せっかくなので RLS(Row Level Security) を有効にしたいよねってことで試してた
プロジェクトがあって、メンバーがいて、ページがいて...みたいな DB スキーマで、RLS のサンプルでも多対多の中間テーブルを作成して、RLS の
USING
句の中で中間テーブルと
auth.uid()
を突き合わせて認証状態を検証する....ということにトライしてたんだが、サンプル相当の
SQL を書いても406が返ってきて困った
ここで完全に盲点だったのは、この中間テーブル自体の RLS の状態で、ページの RLS 単体をいじってても中間テーブルの RLS が有効になっていて、ポリシーがない状態(これがデフォルトになっちゃうのでハマっていた)だとページの RLS で中間テーブルの RLS が突合できなくてダメだったっぽい
よくよーくドキュメントを読むと
Note: If RLS is also enabled for members, the user must also have read (select) access to members. Otherwise the joined query will not yield any results.
て書いてあって膝を打った
なんかキャレットの追従があやしかったり、日本語を入力する時に確定前のワードが投入されてたりいささか怪しい部分はあるけど Supabase をバックエンドに Realtime で複数クライアントで共同編集できるモノが動いた