Je suis un peu confus quant à la définition des autorisations dans PostgreSQL.
J'ai ces rôles:
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}
et bases de données:
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------------+--------+----------+-------------+-------------+-------------------
myapp_production | rails | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
...
l'utilisateur myapp
n'a aucun problème à interroger la myapp_production
base de données en ajoutant et en supprimant des enregistrements. J'aimerais meltemi
également pouvoir interroger la même base de données. Donc, j'ai créé un rôle rails
qui possède la base de données et fait les deux meltemi
et les myapp
membres de rails
. Mais je reçois toujours des permission denied for relation
erreurs. Meltemi
peut afficher le schéma mais ne peut pas interroger la base de données.
Je viens de remarquer (avec \dt
commande) quemyapp
c'est le propriétaire des tables:
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+-------
public | events | table | myapp
public | schema_migrations | table | myapp
...
public | users | table | myapp
...
Les tables ont été créées via un ORM (migrations ActiveRecord de Rails).
Je sais que l'autorisation est très différente dans PostgreSQL (par opposition à MySQL et autres que j'ai utilisés). Comment dois-je configurer ma base de données pour que différents utilisateurs puissent y accéder. Certains devraient être capables de CRUD mais d'autres peuvent seulement lire, etc ...
Merci pour toute aide. Désolé, je sais que c'est une question très basique mais je n'ai pas pu trouver la réponse moi-même.
la source
myapp
au lieu derails
ci-dessus? Parce quemyapp
possède les tables (je n'ai jamais spécifié cela, la migration doit avoir). Quoi qu'il en soit, il serait sorta logique si je renommemyapp
àmyapp_group
puis fait un nouvel utilisateurmyapp
qui les rails app utiliseraient pour se connecter à la DB. Makemyapp
et l'existantmeltemi
, les deux membres dumyapp_group
rôle. Mais que se passe-t-il lorsque j'exécute la prochaine migration. ne sera-t-il pas la propriété demyapp
recréer le problème à nouveau?!?roles
(depuis la version 8.1). Les termesuser
etgroup
sont conservés pour des raisons historiques et de compatibilité. Fondamentalement, un "groupe" est un rôle sans le privilège de connexion. Vous pouvez accordermyapp
àmeltemi
même simyapp
c'est juste un autre "utilisateur". Commencez par lire le manuel ici .roles
vsgroups
vsusers
dans Postgres, du moins je pense que je le sais. Désolé d'utiliser la mauvaise terminologie (et la confusion) ci-dessus. Mais je ne comprends toujours pas comment configurer ma base de données, donc un rôle sans connexion OWNS la base de données et deux rôles de connexionmyapp
etmeltemi
peuvent tous deux avoir un accès complet. L'un de ces rôlesmyapp
exécutera des migrations Rails qui, inévitablement?, Créeront de nouvelles tables qui, une fois de plus, appartiennent àmyapp
un utilisateur de connexion. Dois-je simplement en devenirmeltemi
un "membre"myapp
et en finir avec cela? Mais cela semble juste maladroit ... non?!?myapp
tiennentmeltemi
, alors ce serait la bonne chose à faire. Si vous ne souhaitezmeltemi
obtenir qu'un sous-ensemble de privilèges, ce n'est pas le cas. Créez ensuite un rôle de groupe pour détenir l'ensemble de privilèges et accordez-le àmeltemi
. Vous serez très probablement intéressé par cette question connexe sur SO . J'ai répondu en expliquantDEFAULT PRIVILEGES
SET ROLE
commande au début de vos migrations et uneRESET ROLE
à la fin, mais je ne ferais pas confiance à Rails pour exécuter le tout correctement dans l'ordre. Erwin a raison; dans ce cas, la meilleure solution consistera àGRANT
ce que les rails utilisateur confèrent la propriété à l'autre utilisateur, en utilisant le premier utilisateur comme groupe pour le second.