← головнаПрограмування

Що таке Row Security в PostgreSQL і навіщо це Rails-розробникам

У PostgreSQL є потужна, але часто недооцінена фіча - Row Level Security (RLS). Якщо коротко, це захист даних на рівні рядків таблиці, тобто — система вирішує, які саме записи користувач може бачити або змінювати, ще д...

ЗмістНатисність на посилання, щоб перейти до потрібного місця
У 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), але вшитий у саму базу даних.

🔥 Більше дописів

Всі публікації
Що таке HAR file (HTTP Archive)?
Програмування25 серп. '25, 18:23

Що таке HAR file (HTTP Archive)?

HAR file (HTTP Archive) - це спеціальний формат файлу .har, у якому зберігається журнал роботи ве...

Що таке NP-складність?
Програмування16 вер. '25, 19:31

Що таке NP-складність?

NP-складність - це клас задач, для яких дуже складно знайти рішення, але легко перевірити правиль...

Що таке ivar у Ruby / Rails?
Програмування19 жовт. '25, 20:12

Що таке ivar у Ruby / Rails?

ivar - це скорочення від instance variable (змінна екземпляра). У Ruby вона записується з @ перед...