🧱 Суть

RLS (Row Level Security) – механизм PostgreSQL (и Supabase), который позволяет ограничивать доступ к строкам таблицы на основе правил (политик).

Даже если пользователь знает имя таблицы и выполняет запрос, он увидит только те записи, которые разрешены политиками.

В Supabase RLS применяется ко всем запросам, выполненным через anon-ключ.

📦 Проблема

Без RLS любой авторизованный пользователь потенциально смог бы получить данные других пользователей.

Например, есть таблица:

user_profiles

Если не ограничить доступ, запрос:

supabase.from('user_profiles').select('*');

может вернуть профили всех пользователей.

RLS позволяет определить, какие строки доступны каждому пользователю.

✅ Решение

Включить RLS для таблицы:

ALTER TABLE user_profiles ENABLE ROW LEVEL SECURITY;

Создать политику доступа.

Например, разрешить пользователю видеть только собственный профиль:

CREATE POLICY "Users can select their own profile"
ON public.user_profiles
FOR SELECT
USING (auth.uid() = id);

Здесь:

auth.uid()

– идентификатор текущего авторизованного пользователя.

💻 Код

Включение RLS:

ALTER TABLE user_profiles ENABLE ROW LEVEL SECURITY;

Политика чтения собственного профиля:

CREATE POLICY "Users can select their own profile"
ON public.user_profiles
FOR SELECT
USING (auth.uid() = id);

После этого обычный запрос:

const { data } = await supabase
  .from('user_profiles')
  .select('*')
  .eq('id', user.id)
  .single();

вернёт данные только в том случае, если пользователь имеет право их читать.

🎯 Вывод

  • RLS управляет доступом на уровне отдельных строк.
  • Все клиентские запросы через anon-ключ подчиняются RLS.
  • Без соответствующей политики пользователь не сможет получить данные, даже если они существуют.
  • Практически каждая пользовательская таблица в Supabase должна иметь настроенные политики доступа.

🔗 Связано