Supabase: Row Level Security policy violation
SupabaseのRLSポリシーによりアクセスが拒否された場合のエラー原因と解決策
概要
SupabaseのRow Level Security (RLS)ポリシーによりデータアクセスが拒否されるエラーです。
エラーメッセージ
``` new row violates row-level security policy for table “posts” ```
原因
- RLSポリシー未設定: テーブルにポリシーがない
- 認証情報の欠落: anon keyでアクセス
- ポリシー条件の不一致: WHERE句の条件を満たさない
- JWTの期限切れ: 認証トークンが無効
解決策
1. 基本的なRLSポリシーを作成
```sql – RLSを有効化 ALTER TABLE posts ENABLE ROW LEVEL SECURITY;
– SELECT ポリシー CREATE POLICY “Users can view own posts” ON posts FOR SELECT USING (auth.uid() = user_id);
– INSERT ポリシー CREATE POLICY “Users can create posts” ON posts FOR INSERT WITH CHECK (auth.uid() = user_id);
– UPDATE ポリシー CREATE POLICY “Users can update own posts” ON posts FOR UPDATE USING (auth.uid() = user_id);
– DELETE ポリシー CREATE POLICY “Users can delete own posts” ON posts FOR DELETE USING (auth.uid() = user_id); ```
2. 公開データ用ポリシー
```sql – 誰でも読める CREATE POLICY “Public posts are viewable” ON posts FOR SELECT USING (is_public = true); ```
3. 認証状態を確認
```javascript import { createClient } from ‘@supabase/supabase-js’;
const supabase = createClient(url, anonKey);
// ログイン状態を確認 const { data: { user } } = await supabase.auth.getUser(); console.log(user);
// セッションを確認 const { data: { session } } = await supabase.auth.getSession(); ```
4. Service Roleでバイパス(バックエンドのみ)
```javascript // サーバーサイドでのみ使用 const supabaseAdmin = createClient(url, serviceRoleKey);
// RLSをバイパスして操作 const { data } = await supabaseAdmin .from(‘posts’) .select(’*’); ```
よくある間違い
- クライアントでservice_role_keyを使用
- auth.uid()の代わりにユーザーIDをハードコード
- RLS有効化後にポリシー作成を忘れる
関連エラー
関連エラー
Database の他のエラー
この記事は役に立ちましたか?