🔒 Row Level Security (RLS) в Supabase

RLS — это механизм PostgreSQL, позволяющий разграничивать доступ к данным на уровне строк прямо в базе данных. Это гарантирует безопасность, даже если ваш фронтенд скомпрометирован.

🟢 Основы RLS

Для каждой таблицы в Supabase Dashboard (Database Tables) необходимо:

  1. Включить переключатель Enable RLS.
  2. Создать хотя бы одну политику (Policy), иначе доступ ко всем строкам будет закрыт.

🛠 Практические примеры политик (SQL)

1. Доступ только владельцу строки

Если в таблице есть колонка uuid_owner, сопоставляем её с ID авторизованного пользователя.

(auth.uid() = uuid_owner)

2. Права только для Администраторов

Предположим, в таблице users есть колонка tariff (или role).

(EXISTS ( 
  SELECT 1 FROM users 
  WHERE users.id = auth.uid() AND users.tariff = 'admin'
))

3. Доступ при совпадении столбцов в разных таблицах

Например, пользователь (users) видит товары (productos) только своего магазина (myShopN == shopIDRef).

(EXISTS ( 
  SELECT 1 FROM users u 
  JOIN productos p ON u."myShopN" = p."shopIDRef"
  WHERE u.id = auth.uid()
))

⚡️ Продвинутые техники

Безопасность VIEW

По умолчанию View наследуют права создателя (security definer). Чтобы к ним применялись правила RLS таблиц, нужно добавить модификатор:

ALTER VIEW name_of_view SET (security_invoker = true);

Дать доступ конкретному UUID

Если нужно жестко прописать доступ для технического аккаунта:

(auth.uid() = 'your-uuid-here'::uuid)

📺 Видео-гайд


Смотрите также: Индекс Supabase