ERRORE: autorizzazione negata per la relazione tablename su Postgres durante il tentativo di SELECT come utente di sola lettura


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

L'utente in sola lettura può connettersi, vedere le tabelle ma quando prova a fare una semplice selezione ottiene:

ERROR: permission denied for relation mytable
SQL state: 42501

Questo sta accadendo su PostgreSQL 9.1

Cosa ho sbagliato?


1
Potete fornire alcuni dettagli sulla "relazione mytable"? Schema, è una tabella "reale" (o una vista / funzione), innesca ...
— Igor Romanchenko

Risposte:


162

Ecco la soluzione completa per PostgreSQL 9+, aggiornata di recente.

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;

Grazie a https://jamie.curle.io/creating-a-read-only-user-in-postgres/ per diversi aspetti importanti

Se qualcuno trova un codice più breve, e preferibilmente uno che è in grado di eseguirlo per tutti i database esistenti, complimenti extra.


6
questo include le visualizzazioni?
— Frank Conry

9
Perché concedi l' GRANT ALLautorizzazione per impostazione predefinita all'utente di sola lettura?
— Slava Fomin II

1
Ho dato esattamente come è stato definito, ancora lo stesso errore
— Anish Gopinath

può confermare i diritti concessi utilizzando \ddp. Dovrebbe essere visualizzato =r/come granting_user=r/readonly_userper l'accesso in sola lettura.
— Greg Bray,

Questo è SQL verbatim dalla domanda. Non vedo come fornisce una soluzione.
— r351574nc3

12

Prova ad aggiungere

GRANT USAGE ON SCHEMA public to readonly;

Probabilmente non sapevi che è necessario disporre delle autorizzazioni necessarie per uno schema, al fine di utilizzare gli oggetti nello schema.


Qualcosa di strano sta accadendo, ho eseguito questi comandi sul server utilizzando psqlcome postgresutente e faccio ottenere una risposta adeguata, GRANT. Tuttavia, quando guardo l'ACL sulle tabelle vedo solo altri due account, uno è il proprietario del database jirausere un altro account di sola lettura denominato qauser. Ma il mio readonlynon appare lì. Postgres è la versione 9.1 e ho anche riavviato il server, ma ancora non succede nulla.
— sorin

2
qual è / era l'output di \ du nella console psql? Puoi ancora dare questo output o è già corretto come nella tua risposta?
— sufleR

Non so davvero cosa sia successo, poiché l'output era corretto (GRANT). YEsterday non ha funzionato, ma oggi ha funzionato dopo aver eseguito, di nuovo, tutti e 3 i comandi.
— sorin

3
Nota: la risposta prevista a questo è semplicemente "GRANT". Se vedi "ATTENZIONE: nessun privilegio è stato concesso per" pubblico "", NON ha funzionato. L'utente in sola lettura non può concedere a se stesso autorizzazioni aggiuntive. Solo un utente con autorizzazioni "GRANT" può farlo, quindi probabilmente dovrai accedere come superutente.
— Peter Vermont

Ciao, quando provo a CONCEDERE SELEZIONA SU TUTTE LE TABELLE IN SCHEMA public TO postgres; risponde: ERRORE: permesso negato per il registro di database di relazione. Sai cosa sto facendo di sbagliato? Grazie (succede su GAppEngine Posgres9.6 utilizzando l'indirizzo pubblico e accedendo tramite terminale)
— Mike

-5

Questo ha funzionato per me:

Verificare il ruolo corrente a cui si è connessi utilizzando: SELECT CURRENT_USER, SESSION_USER;

Nota : deve corrispondere al proprietario dello schema.

Schema | Nome | Tipo | Proprietario
-------- + -------- + ------- + ----------

Se il proprietario è diverso, concedi tutte le concessioni al ruolo utente corrente dal ruolo di amministratore:

GRANT "ROLE_OWNER" a "CURRENT ROLENAME";

Quindi prova ad eseguire la query, darà l'output poiché ora ha accesso a tutte le relazioni.


5
Cambiare il proprietario in un utente chiamato readonly difficilmente suona come la soluzione giusta.
— Anna

A seconda del caso, la causa può effettivamente essere il proprietario di un tavolo sbagliato (era un nemico). Modo corretto di tabella del cambiamento ownershiip in PostgreSQL: vedi stackoverflow.com/a/13535184
— tanius

-6

assicurati che il tuo utente abbia attributi nel suo ruolo. per esempio:

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

dopo aver eseguito il seguente comando:

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 | {}

ha risolto il problema.

guarda il tutorial per ruoli e cose qui: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2


18
No! Dare il ruolo di Superuser a un utente chiamato "readonly" per eseguire una "selezione" non è la soluzione corretta.
— Anna

@Anna Non è quello che sta succedendo qui. Questo thread non riguarda la concessione dell'accesso in sola lettura. Questo thread riguarda la concessione dell'accesso a un utente per fornire a un altro utente l'accesso in sola lettura. IMHO, questo è corretto. Se il tuo utente non è un Superuser, non puoi creare un utente di sola lettura. L'errore in cui ci si ERROR: permission denied for relation mytable
— imbatte è dovuto

-7

Dovresti eseguire la query successiva:

GRANT ALL ON TABLE mytable TO myuser;

O se il tuo errore è in una vista, forse la tabella non ha l'autorizzazione, quindi dovresti eseguire la query successiva:

GRANT ALL ON TABLE tbm_grupo TO myuser;

5
L'utente è chiamato "readonly". È dubbio che l'obiettivo sia dare all'utente tutte le autorizzazioni. Vuole solo fare una selezione.
— Anna

Questo annulla lo scopo di nominare l'utente "ReadOnly" se stai dando ALTER DROP DELETEEct. A quell'utente ...
— JayRizzo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.