今日学んだこと:Row Level Security(RLS)設定に関して

2025年8月31日

概要

今日はRLSについて学んだ。

ポイント1

  • Row Level Security(RLS)は、テーブル内の行へのアクセスを制御する機能

  • 従来のAPI開発であればコードで権限チェックをしている

# FastAPI例
@app.get("/posts")
async def get_posts(current_user: User = Depends(get_current_user)):
    # コードで権限チェック
    if current_user.role != "admin":
        return posts.filter(author_id=current_user.id)
    return posts
  • Supabaseの場合はフロンエンドから直接データベースにアクセスするため、RLSが権限チェックのために必要
// フロントエンドから直接データベースにアクセス
const { data } = await supabase
  .from('posts')
  .select('*') // RLSが自動的に権限をチェック  

ポイント2

RLSは実際にはPostgreSQLの標準機能。

Supabaseがこれを活用している理由:

  • 直接データベースアクセス: フロントエンドから直接PostgreSQLにアクセス

  • セキュリティの最後の砦: どんなクエリでも必ずRLSポリシーが適用される

  • 統一された権限管理: すべてのテーブルアクセスが同じルールに従う

RLS を利用するためには、作成した任意のテーブルにおいて RLS を有効化して Row Security Policies を作成する必要がある

実装例・コード例

RLS設定例

-- テーブルでRLSを有効化
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;

-- ポリシー作成(例:自分の投稿のみ表示)
CREATE POLICY "Users can view own posts" ON posts
FOR SELECT USING (auth.uid() = author_id);

-- ポリシー作成(例:自分の投稿のみ更新可能)
CREATE POLICY "Users can update own posts" ON posts
FOR UPDATE USING (auth.uid() = author_id);

参考文献・リンク

https://zenn.dev/taxin/articles/postgresql-row-level-security-policy