ERREUR: autorisation refusée pour la relation nomtable sur Postgres en essayant un SELECT en tant qu'utilisateur en lecture seule

88
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

L'utilisateur en lecture seule peut se connecter, voir les tableaux, mais lorsqu'il essaie de faire une simple sélection, il obtient:

ERROR: permission denied for relation mytable
SQL state: 42501

Cela se produit sur PostgreSQL 9.1

Qu'est-ce que j'ai fait de mal?

Sorin
la source
1
Pouvez-vous fournir quelques détails sur "relation mytable"? Schéma, est-ce une "vraie" table (ou une vue / fonction), des déclencheurs ...
Igor Romanchenko

Réponses:

161

Voici la solution complète pour PostgreSQL 9+, mise à jour récemment.

CREATE USER readonly  WITH ENCRYPTED PASSWORD 'readonly';
GRANT USAGE ON SCHEMA public to readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

-- repeat code below for each database:

GRANT CONNECT ON DATABASE foo to readonly;
\c foo
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo"
GRANT USAGE ON SCHEMA public to readonly; 
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

Merci à https://jamie.curle.io/creating-a-read-only-user-in-postgres/ pour plusieurs aspects importants

Si quelqu'un trouve un code plus court, et de préférence un code capable de l'exécuter pour toutes les bases de données existantes, félicitations supplémentaires.

Sorin
la source
6
cela inclut-il les vues?
Frank Conry
9
Pourquoi donnez-vous l' GRANT ALLautorisation par défaut à l'utilisateur en lecture seule?
Slava Fomin II
1
J'ai donné exactement comme il est défini, toujours l'erreur sam
Anish Gopinath
peut confirmer les droits accordés en utilisant \ddp. Doit apparaître =r/comme granting_user=r/readonly_userpour un accès en lecture seule.
Greg Bray
C'est du SQL textuel de la question. Je ne vois pas en quoi cela apporte une solution.
r351574nc3
12

Essayez d'ajouter

GRANT USAGE ON SCHEMA public to readonly;

Vous ne saviez probablement pas qu'il fallait disposer des autorisations requises sur un schéma pour pouvoir utiliser des objets dans le schéma.

Souffrir
la source
Quelque chose d' étrange se passe, je lance ces commandes sur le serveur en utilisant psqlcomme postgresutilisateur et je reçois une réponse appropriée, GRANT. Pourtant, quand je regarde l'ACL sur les tables, je ne vois que deux autres comptes, l'un étant le propriétaire de la base de données jirauseret un autre compte en lecture seule nommé qauser. Mais mon readonlyn'y apparaît pas. Postgres est la version 9.1 et j'ai même redémarré le serveur, toujours rien ne se passe.
sorin
2
quelle est / était la sortie de \ du dans la console psql? Pouvez-vous toujours donner cette sortie ou elle est déjà corrigée comme dans votre réponse?
sufleR
Je ne sais pas vraiment ce qui s'est passé, car la sortie était correcte (GRANT). Hier, cela n'a pas fonctionné, mais aujourd'hui, cela a fonctionné après avoir exécuté, à nouveau, les 3 commandes.
sorin
3
Remarque: La réponse attendue à cela est simplement «GRANT». Si vous voyez «AVERTISSEMENT: aucun privilège n'a été accordé pour« public »», cela n'a PAS fonctionné. L'utilisateur en lecture seule ne peut pas s'octroyer des autorisations supplémentaires. Seul un utilisateur avec les autorisations 'GRANT' peut le faire, vous devrez donc probablement vous connecter en tant que superutilisateur.
PeterVermont
Salut, quand j'essaye de GRANT SELECT SUR TOUTES LES TABLES DANS SCHEMA public TO postgres; il répond: ERREUR: autorisation refusée pour la relation databasechangeloglock. Sais-tu ce que je fais de mal? Merci (cela se produit sur GAppEngine Posgres9.6 en utilisant l'adresse publique et en accédant via le terminal)
Mike
-5

Cela a fonctionné pour moi:

Vérifiez le rôle actuel auquel vous êtes connecté en utilisant: SELECT CURRENT_USER, SESSION_USER;

Remarque : il doit correspondre au propriétaire du schéma.

Schéma | Nom | Type | Propriétaire
-------- + -------- + ------- + ----------

Si le propriétaire est différent, attribuez toutes les autorisations au rôle d'utilisateur actuel à partir du rôle d'administrateur en:

GRANT 'ROLE_OWNER' à 'CURRENT ROLENAME';

Ensuite, essayez d'exécuter la requête, elle donnera la sortie car elle a maintenant accès à toutes les relations.

Dhwani Shah
la source
5
Changer le propriétaire en un utilisateur appelé en lecture seule ne ressemble guère à la bonne solution.
Anna
Selon votre cas, un mauvais propriétaire de table peut en effet être la cause (c'était mon ennemi). Bonne façon de changer le propriétaire de la table dans PostgreSQL: voir stackoverflow.com/a/13535184
tanius
-6

assurez-vous que votre utilisateur dispose d'attributs sur son rôle. par exemple:

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      |                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}

après avoir exécuté la commande suivante:

postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      | Superuser                                      | {}
postgres  | Superuser, Create role, Create DB, Replication | {}

il a résolu le problème.

voir le tutoriel pour les rôles et autres choses ici: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2

PuN1sh3r
la source
18
Non! Donner le rôle de superutilisateur à un utilisateur appelé «lecture seule» pour effectuer une «sélection» n'est pas la bonne solution.
Anna
@Anna Ce n'est pas ce qui se passe ici. Ce fil ne consiste pas à donner un accès en lecture seule. Ce fil de discussion consiste à donner à un utilisateur l'accès pour donner à un autre utilisateur un accès en lecture seule. IMHO, c'est correct. Si votre utilisateur n'est pas un superutilisateur, vous ne pouvez pas créer un utilisateur en lecture seule. L'erreur en cours d'exécution est de pouvoir créer un utilisateur en lecture seuleERROR: permission denied for relation mytable
r351574nc3
-7

Vous devez exécuter la requête suivante:

GRANT ALL ON TABLE mytable TO myuser;

Ou si votre erreur se trouve dans une vue, la table n'a peut-être pas l'autorisation, vous devez donc exécuter la requête suivante:

GRANT ALL ON TABLE tbm_grupo TO myuser;
oui
la source
5
L'utilisateur est appelé "lecture seule". Il est peu probable que l’objectif soit de donner toutes les autorisations à l’utilisateur. Il veut juste faire une sélection.
Anna
Cela va à l'encontre de l'objectif de nommer l'utilisateur «ReadOnly» si vous donnez ALTER DROP DELETEEct. À cet utilisateur ...
JayRizzo