🧱 Суть
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 должна иметь настроенные политики доступа.