Anfängerfrage: Wie Tabellenrechte setzen?

Hallo,

ich bin neu bei PgSQL und habe auch allgemein noch nicht viel mit Benutzerverwaltung in DB’s gemacht, deshalb habe ich keine Ahnung wie ich das angehen soll, und in der Manual hab ich, wahrschinlich mangels richtigem Suchansatz, auch nichts gefunden…

Habe folgendes Scenario:
1 Datenbank
1 User-/Rollentabelle wo die User inkl. deren Rolle/Rechte gespeichert werden (Rechte/Rollen werden aber wahrscheinlich in eine 2. Tabelle ausgelagert, da ein User mehrere haben kann)
x Datentabellen wo bestimmte User auf allen lesen & schreiben, andere User auf allen lesen aber nur bestimmte schreiben dürfen sollen

Was muss ich jetzt machen, um das zu bewerkstelligen?
Habe wie gesagt keine Ahnung, wo ich da Anfangen soll bzw. nach was ich suchen muss. Ich habe zwar gefunden, wie ich DB-User anlege, aber nicht, wie ich bestimmten Tabellen “Userrechte” zuordne.

Gibt es auch ein “write-only”-Recht, also das ein User nur schreiben, aber nicht ändern darf?
Kann ich es irgendwie machen, dass ein User eine Tabelle nicht lesen kann, aber eine StoredProcedure ausführen darf, welche in dieser Tabelle liest? Also z.b. darf ein User die Usertabelle nicht lesen, aber die StoredProcedure CheckUser(USername,Password) aufrufen, welche in der Usertabelle nachsieht, ob es den User gibt.

mfg
cfi

Wirf doch mal einen Blick auf GRANT und REVOKE.

Neben dem, was ads schon schrieb: für functions gibt es Parameter security definer z.B.

Andreas

das macht nix … auch wenn man nicht mehr neu ist muss man keine ahnung haben

du schreibst, dass du auch noch eine “eigene nutzerverwaltung” implementieren moechtest … also user und rollen/gruppen in tabellen - so gehe ich i.d.R. auch vor, wenn man privilegien auch für funktionen der anwendung abbilden moechte … man sollte diese aber ein “klein wenig” von denen der DB unterscheiden.

wie AK schon schrieb, gibt es da die Kommandos GRANT und REVOKE … außerdem solltest du dir CREATE [LOGIN] ROLE anschauen mit denen du auf einem DB-Server !!! User und Rollen erzeugst - wichtig → diese gelten für ALLE DBs die der Server bereitstellt - also nicht nur für eine DB - sie werden auch bei einem DB-Backup (hoffentlich erzaehl ich jetzt keinen mist) nicht mit gesichert.

Also … im Prinzip legst du mit CREATE [LOGIN] ROLE dir Nutzer beziehungsweise Rollen an … Bei der Vergabe von Privilegien unterscheidet PG nicht zwischen einem Nutzer und einer Rolle … eine Rolle kann sich halt nicht anmelden. Wenn du die DB aufbaust (Modell), empfielt es sich eigentlich immer wenigstens eine (Gruppen-)Rolle zu erzeugen, und eine (Login-)Rolle die Mitglied dieser Gruppe ist.

Für Jedes Objekt (DB, Schema, Table, Funktion …) solltest du dann dieser (Gruppen-)Rolle gleich alle Rechte einräumen die sie benötigt um die Gewünschte Funktion auszuführen. Da die Login-Rolle Mitglied der Gruppe ist, darf sie natürlich all das was der Gruppe erlaubt ist.

Wenn du dir GRANT für Tables anschaust, wirst du feststellen, dass nach GRANT die klassichen Operationen angegeben werden koennen, die du erlauben moechtest - also SELECT, UPDATE, DELETE, INSERT … selbstverfreilich erlaubt ein GRANT INSERT ON table ausschliesslich ein INSERT auf der table.

Für andere Objekte wie DB, SCHEMA, … kann es andere Operationen geben die man erlauben kann … das ist aber alles in der Doku für GRANT beschrieben - REVOKE funktioniert ähnlich und entzieht die Rechte …

Zu deiner User-/Rollen-Tabelle … also ich hab dafuer ein Frontend, was im prinzip nix weiter macht als diese Tabellen wie üblichen Stammdaten Tabellen zu fuellen und bei einem INSERT UPDATE oder DELETE entsprechende CREATE ROLE bzw. GRANT und REVOKE statements für die User abzusetzen … wenn ich also einen User erzuege, dann wird der einfach mit CREATE ROLE auf dem PG-Server erzeugt und mit GRANT zum Mitglied der o.g. “Default Role” gemacht.

Du solltest Dir diesen Schritt aber überlegen … es ist nicht immer gewünscht, dass Solchen Anwendungs-Benutzer auch noch eine Login-Rolle für den DB-Server erhalten … obwohl ich das als etwas “professioneller” empfinde.

Danke, an euch, für die schnellen Antworten.

@symbiont: Genau so wie du es beschrieben hast, möchte ich es machen (die Usertabelle soll eben auch Privilegien für die Anwendung speichern).

Das mit GRANT/REVOKE ist mir jetzt klar, aber in das mit den securty definer bei stored procedures mus ich mir noch anschauen, aber jetzt weis ich wo(nach) ich suchen muss…