Closed14

SupabaseでRow Level Securityを使って認証を実装する

hirotakahirotaka

テーブル

postテーブル

  • id
  • content
  • user_id
  • created_at
  • is_published

commentテーブル

  • id
  • content
  • user_id
  • created_at
  • post_id
hirotakahirotaka

自分のPostだけすべての操作ができるようにする。

create policy "Enable all actions for users based on user_id"
    on public.post for all
    using ( auth.uid() = user_id )
    with check ( auth.uid() = user_id );
hirotakahirotaka

公開したPostは誰でもみれる

create policy "Enable user to select a published post"
    on public.post for select
    using ( is_published = true );
hirotakahirotaka

Postを見られるユーザはコメントも見られるようにする。

create policy "Enable user to view comments for posts they can view"
    on public.users for select
    using (
          exists (
              select 1 from post where post.id = comment.post_id
          )
    );
hirotakahirotaka

自分が見られるPostにコメントをかける。

create policy "Allow users to insert comments on posts they can see"
    on public.comment for insert
    with check (
          exists (
              select 1 from post where post.id = comment.post_id
          )
    );
hirotakahirotaka

自分が書いたコメントは更新できる。

create policy "Update comment that we can view post for and that we onw"
    on public.comment for update
    with check (
          exists (
              select 1 from post where post.id = comment.post_id
          )
    );
タイラータイラー

こちらもこの状態だとpostが閲覧できる人全員が更新できる状態になってしまっているかもです!

hirotakahirotaka

自身が書いたコメントは削除できる。

create policy "Delete comment that we can view post for and that we onw"
    on public.comment for delete
    with check (
          exists (
              select 1 from post where post.id = comment.post_id
          )
    );
hirotakahirotaka

Postの所有者はコメントを削除できる。

create policy "user can moderate comments on their posts"
    on public.comment for delete
    using (
        auth.uid() in (
            select user_id from post where post.id = comment.post_id
        )
    );
このスクラップは2021/12/14にクローズされました