InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
PostgreSQL hat eine leistungsstarke, aber oft unterschätzte Funktion - Row Level Security (RLS). Kurz gesagt, es ist der Datenschutz auf Zeilenebene der Tabelle, das heißt - das System entscheidet, welche Datensätze der Benutzer sehen oder ändern kann, noch bevor die Abfrage in Ihren Rails-Code gelangt.
Wie es funktioniert
In einer normalen Situation wird der Zugriff auf Daten in der Anwendung kontrolliert - zum Beispiel schreiben wir in Rails:
@posts = Post.where(user_id: current_user.id)
Aber RLS ermöglicht es, diese Überprüfung der Datenbank selbst zu überlassen. Sie aktivieren die Sicherheitsrichtlinie für die Tabelle:
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);
Danach, selbst wenn jemand SELECT * FROM posts ausführt, setzt PostgreSQL automatisch die Bedingung ein, damit der Benutzer nur seine Zeilen sieht.
Wie man RLS in Rails integriert
In Rails kann man vor der Ausführung der Abfrage current_user.id im Datenbankkontext setzen:
ActiveRecord::Base.connection.execute("SET app.current_user_id = #{current_user.id}")
Und dann geben alle Abfragen (Post.all, Post.find, sogar joins) nur die erlaubten Daten zurück - ohne zusätzliche where im Code.
Das ist praktisch für Mehrbenutzersysteme, SaaS oder APIs, wo die Sicherheit nicht nur vom Anwendungscode abhängen sollte.
Warum das überhaupt
- Datenbanksicherheit - selbst wenn jemand versehentlich where(user_id: ...) vergisst, werden die Daten nicht durchgesickert.
- Einfachheit der Abfragen - man kann Model.all schreiben, ohne über Filter nachzudenken.
- Einheitliche Zugriffskontrolle - die Regeln werden zusammen mit den Daten gespeichert und nicht über Controller und Services verstreut.
RLS ersetzt nicht die Autorisierung in der Anwendung. Es ist eine zusätzliche Schutzebene, die garantiert, dass selbst auf niedriger Ebene niemand "überflüssige" Daten erhält. Row Level Security ist wie where(user_id: current_user.id), aber in die Datenbank selbst eingebaut.
Dieser Beitrag hat noch keine Ergänzungen vom Autor.