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

Обкладинка допису: Що таке Row Security в PostgreSQL і навіщо це Rails-розробникам
ЗмістНатисність на посилання, щоб перейти до потрібного місця
У 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 серп., 18:23

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

meme code
meme code@memecode
Що таке Bubble Sort (пояснення алгоритму)?
16 вер., 18:42

Що таке Bubble Sort (пояснення алгоритму)?

meme code
meme code@memecode
Що таке експоненційне зростання?
16 вер., 18:57

Що таке експоненційне зростання?

meme code
meme code@memecode
Що таке факторіальна складність?
16 вер., 19:03

Що таке факторіальна складність?

meme code
meme code@memecode
Що таке NP-складність?
16 вер., 19:31

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

meme code
meme code@memecode
Offset vs Cursor Pagination у Rails: що вибрати та чому
24 вер., 15:22

Offset vs Cursor Pagination у Rails: що вибрати та чому

meme code
meme code@memecode