web-dev-qa-db-fra.com

PostgreSQL: autorisation refusée pour la relation

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 le myapp_production base de données ajoutant et supprimant des enregistrements. J'aimerais que meltemi puisse également interroger la même base de données. J'ai donc créé un rôle Rails qui possède la base de données et j'ai fait à la fois meltemi et myapp membres de Rails. Mais je reçois toujours permission denied for relation les erreurs. Meltemi peut afficher le schéma mais ne peut pas interroger la base de données.

Je viens de remarquer (avec \dt commande) que myapp 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.

14
Meltemi

Je viens d'écrire à ce sujet dans ma réponse à Octroi de droits sur la base de données postgresql à un autre utilisateur sur ServerFault.

Fondamentalement, la meilleure solution lorsque vous avez un seul utilisateur et que vous souhaitez accorder les mêmes droits à d'autres utilisateurs est de transformer cet utilisateur en groupe, de créer un nouvel utilisateur avec le même nom que celui d'origine qui est membre du groupe, et accorder ce groupe à d'autres utilisateurs également.

Dans votre cas, Rails est renommé pour dire myapp_users, puis vous créez un nouveau rôle de connexion (utilisateur) nommé Rails et GRANT myapp_users TO Rails. Vous êtes maintenant un GRANT myapp_users TO meltemi. Le nouveau compte Rails et l'utilisateur meltemi ont désormais les droits de l'ancien compte Rails.

Pour un contrôle plus fin, je vous conseille généralement d'éviter de donner aux utilisateurs de connexion au jour le jour ou à leurs groupes la propriété des tables. Donnez-leur accès via un groupe NOINHERIT qu'ils doivent explicitement SET GROUP pour, ou mieux, utiliser un utilisateur complètement différent pour des opérations privilégiées comme DDL et GRANT s. Malheureusement, cela ne fonctionne pas avec Rails, car Rails aime appliquer les migrations chaque fois qu'il le souhaite et AFAIK ne vous donne pas la possibilité de spécifier un utilisateur différent et plus privilégié pour exécuter le migrations comme.

4
Craig Ringer