Ich bin etwas verwirrt über das Festlegen von Berechtigungen in PostgreSQL.
Ich habe diese Rollen:
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
admin | Superuser, Create role, Create DB, Replication | {}
meltemi | Create role, Create DB | {rails}
rails | Create DB, Cannot login | {}
myapp | | {rails}
und Datenbanken:
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------------+--------+----------+-------------+-------------+-------------------
myapp_production | rails | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
...
Benutzer myapp
hat kein Problem, die myapp_production
Datenbank abzufragen, Datensätze hinzuzufügen und zu löschen. Ich möchte meltemi
, dass auch die gleiche Datenbank abgefragt werden kann. Also habe ich eine Rolle erstellt, rails
die die Datenbank besitzt und sowohl Mitglieder meltemi
als auch myapp
Mitglieder von rails
. Aber ich bekomme immer noch permission denied for relation
Fehler. Meltemi
kann das Schema anzeigen, aber die Datenbank nicht abfragen.
Mir ist gerade aufgefallen (mit \dt
Befehl), dass myapp
der Eigentümer der Tabellen ist:
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+-------
public | events | table | myapp
public | schema_migrations | table | myapp
...
public | users | table | myapp
...
Die Tabellen wurden über ein ORM (Rails ActiveRecord Migrations) erstellt.
Ich weiß, dass die Autorisierung in PostgreSQL sehr unterschiedlich ist (im Gegensatz zu MySQL und anderen, die ich verwendet habe). Wie soll ich meine Datenbank einrichten, damit verschiedene Benutzer darauf zugreifen können? Einige sollten in der Lage sein, CRUD, aber andere nur in der Lage zu lesen, etc ...
Vielen Dank für jede Hilfe. Entschuldigung, ich weiß, dass dies eine sehr grundlegende Frage ist, aber ich konnte die Antwort nicht selbst finden.
quelle
myapp
anstelle vonrails
oben zu verwenden? Damyapp
gehören die Tabellen (das habe ich nie angegeben, muss die Migration haben). Auf jeden Fall wäre es sorta Sinn machen , wenn ich umbenanntmyapp
zumyapp_group
und machte dann einen neuen Benutzer ,myapp
die die App Schienen würde DB verbinden. Makemyapp
und das Vorhandenemeltemi
sind beide Mitglieder dermyapp_group
Rolle. Aber was passiert, wenn ich die nächste Migration durchführe? Wird es nicht dazu gehörenmyapp
, das Problem erneut zu erstellen?!?roles
(seit Version 8.1) hat. Die Begriffeuser
undgroup
werden aus historischen Gründen und Kompatibilitätsgründen beibehalten. Grundsätzlich ist eine "Gruppe" eine Rolle ohne Anmeldeberechtigung. Sie können gewährenmyapp
,meltemi
auch wennmyapp
es sich nur um einen anderen "Benutzer" handelt. Beginnen Sie mit dem Lesen des Handbuchs hier .roles
vsgroups
vsusers
Trennung in Postgres, zumindest denke ich, dass ich es tue. Es tut uns leid, die oben angegebene falsche (und verwirrende) Terminologie zu verwenden. Ich verstehe jedoch immer noch nicht, wie ich meine Datenbank einrichten soll, sodass eine Rolle ohne Anmeldung die Datenbank und zwei Anmelderollen BESITZTmyapp
undmeltemi
beide vollen Zugriff haben können. Eine dieser Rollenmyapp
wird die Ausführung von Rails-Migrationen sein, bei denen unweigerlich neue Tabellen erstellt werden, deren Eigentümer wiederummyapp
ein angemeldeter Benutzer ist. Soll ich einfachmeltemi
ein "Mitglied" werdenmyapp
und damit fertig sein? Aber das klingt doch blöd ... nein?!?myapp
die dazu gehörenmeltemi
, dann wäre das das Richtige. Wenn Siemeltemi
nur einen Teil der Berechtigungen erhalten möchten, ist dies nicht der Fall . Erstellen Sie dann eine Gruppenrolle, die die Berechtigungen enthält, und erteilen Sie diese anmeltemi
. Diese verwandte Frage zu SO wird Sie höchstwahrscheinlich interessieren . Ich antwortete erklärendDEFAULT PRIVILEGES
SET ROLE
Befehl zum Beginn Ihrer Migrationen und einen Befehl zumRESET ROLE
Ende hinzufügen , aber ich würde Rails nicht vertrauen, damit das Ganze ordnungsgemäß ausgeführt wird. Erwin hat recht; In diesem Fall besteht die beste Lösung darin, dassGRANT
die Benutzerschienen dem anderen Benutzer den Besitz übertragen und den ersten Benutzer als Gruppe für den zweiten Benutzer verwenden.