Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Czym jest Row Security w PostgreSQL i po co jest to deweloperom Rails?

Okładka posta: Czym jest Row Security w PostgreSQL i po co jest to deweloperom Rails?
Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W PostgreSQL jest potężna, ale często niedoceniana funkcja - Row Level Security (RLS).
Mówiąc krótko, to ochrona danych na poziomie wierszy tabeli, czyli - system decyduje, które dokładnie rekordy użytkownik może zobaczyć lub zmienić, jeszcze zanim zapytanie trafi do twojego kodu Rails.

Jak to działa

W normalnej sytuacji dostęp do danych kontrolowany jest w aplikacji - na przykład w Rails piszemy:
@posts = Post.where(user_id: current_user.id)
Jednak RLS pozwala delegować tę kontrolę samej bazie.
Włączasz politykę bezpieczeństwa dla tabeli:
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);
Po tym nawet jeśli ktoś wykona SELECT * FROM posts,
PostgreSQL automatycznie wstawi warunek, aby użytkownik widział tylko swoje wiersze.

Jak zintegrować RLS w Rails

W Rails można przed wykonaniem zapytania ustawić current_user.id w kontekście bazy:
ActiveRecord::Base.connection.execute("SET app.current_user_id = #{current_user.id}")
I wtedy wszystkie zapytania (Post.all, Post.find, nawet joins) będą zwracać tylko dozwolone dane - bez dodatkowych where w kodzie.
To jest wygodne dla systemów wielodostępnych, SaaS lub API, gdzie bezpieczeństwo nie powinno zależeć tylko od poziomu aplikacji.

Po co to w ogóle

  • Bezpieczeństwo na poziomie Bazy Danych - nawet jeśli ktoś omyłkowo zapomni o where(user_id: ...), dane nie wyciekną.
  • Prostota zapytań - można pisać Model.all, nie myśląc o filtrach.
  • Jednolity kontrola dostępu - zasady są przechowywane razem z danymi, a nie rozrzucone po kontrolerach i serwisach.
RLS nie zastępuje autoryzacji w aplikacji. Jest to dodatkowy poziom ochrony, który gwarantuje, że nawet na niskim poziomie nikt nie uzyska "zbędnych" danych. Row Level Security - to jak where(user_id: current_user.id), ale wbudowane w samą bazę danych.

Ten post nie ma jeszcze żadnych dodatków od autora.

Co to jest plik HAR (HTTP Archive)?
25 sie 18:23

Co to jest plik HAR (HTTP Archive)?

meme code
meme code@memecode
Czym jest Bubble Sort (wyjaśnienie algorytmu)?
16 wrz 18:42

Czym jest Bubble Sort (wyjaśnienie algorytmu)?

meme code
meme code@memecode
Czym jest wzrost eksponencjalny?
16 wrz 18:57

Czym jest wzrost eksponencjalny?

meme code
meme code@memecode
Czym jest złożoność faktorialna?
16 wrz 19:03

Czym jest złożoność faktorialna?

meme code
meme code@memecode
Czym jest NP-trudność?
16 wrz 19:31

Czym jest NP-trudność?

meme code
meme code@memecode
Offset vs Cursor Pagination w Rails: co wybrać i dlaczego
24 wrz 15:22

Offset vs Cursor Pagination w Rails: co wybrać i dlaczego

meme code
meme code@memecode
Czym jest ivar w Ruby / Rails?
19 paź 20:12

Czym jest ivar w Ruby / Rails?

meme code
meme code@memecode
Podstawowe metody uwierzytelniania w API
19 paź 20:26

Podstawowe metody uwierzytelniania w API

meme code
meme code@memecode
Czym różni się OAuth 1 od OAuth 2
19 paź 20:34

Czym różni się OAuth 1 od OAuth 2

meme code
meme code@memecode
Czym jest ORM i po co jest potrzebny?
26 paź 14:00

Czym jest ORM i po co jest potrzebny?

meme code
meme code@memecode
MCP: nowy internet, gdzie strony komunikują się z AI
4 lis 11:43

MCP: nowy internet, gdzie strony komunikują się z AI

meme code
meme code@memecode
Dlaczego TOON jest lepszy od JSON przy pracy z AI?
14 lis 15:14

Dlaczego TOON jest lepszy od JSON przy pracy z AI?

meme code
meme code@memecode