ЗмістНатисність на посилання, щоб перейти до потрібного місця
У PostgreSQL є потужна, але часто недооцінена фіча - Row Level Security (RLS). Якщо коротко, це захист даних на рівні рядків таблиці, тобто — система вирішує, які саме записи користувач може бачити або змінювати, ще до того, як запит потрапить у ваш Rails-код.
Як це працює
У звичайній ситуації доступ до даних контролюється у застосунку — наприклад, у Rails ми пишемо:
@posts = Post.where(user_id: current_user.id)
Але RLS дозволяє делегувати цю перевірку самій базі. Ви вмикаєте політику безпеки для таблиці:
ALTER TABLE posts ENABLE ROW LEVEL SECURITY; CREATE POLICY user_is_owner ON posts FOR SELECT USING (user_id = current_setting('app.current_user_id')::int);
Після цього навіть якщо хтось зробить SELECT * FROM posts, PostgreSQL автоматично підставить умову, щоб користувач бачив тільки свої рядки.
Як інтегрувати RLS у Rails
У Rails можна перед виконанням запиту встановлювати current_user.id у контекст бази:
ActiveRecord::Base.connection.execute("SET app.current_user_id = #{current_user.id}")
І тоді всі запити (Post.all, Post.find, навіть joins) повертатимуть тільки дозволені дані - без додаткових where у коді.
Це зручно для багатокористувацьких систем, SaaS або API, де безпека не повинна залежати лише від рівня застосунку.
Навіщо це взагалі
- Безпека на рівні БД — навіть якщо хтось помилково забуде where(user_id: ...), дані не витечуть.
- Простота запитів — можна писати Model.all, не думаючи про фільтри.
- Єдиний контроль доступу — правила зберігаються разом із даними, а не розкидані по контролерах і сервісах.
RLS не замінює авторизацію у застосунку. Вона - додатковий рівень захисту, який гарантує, що навіть на низькому рівні ніхто не отримає "зайві" дані. Row Level Security — це як where(user_id: current_user.id), але вшитий у саму базу даних.
Цей допис поки що не має жодних доповнень від автора/ки.