Concedere l'accesso a tutte le tabelle per un utente


151

Sono nuovo di Postgres e sto provando a migrare i nostri database MySQL. In MySQL posso concedere SELECT, UPDATE, INSERT, e DELETEprivilegi su un utente con privilegi e consentire a tali sovvenzioni da applicare a tutte le tabelle di un database specificato. Mi manca qualcosa in Postgres perché sembra che debba concedere quei privilegi per ogni tavolo uno alla volta. Con molti database e centinaia di tabelle per database che sembra un compito scoraggiante solo per decollare. Inoltre, una volta che un database è in funzione, l'aggiunta di tabelle avviene abbastanza frequentemente che non vorrei concedere autorizzazioni ogni volta se non assolutamente necessario.

Come si ottiene questo meglio?

Risposte:


175

Innanzitutto, è necessario essere in grado di connettersi al database per eseguire query. Questo può essere raggiunto da

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;

Il REVOKEè necessaria perché

La parola chiave PUBLIC indica che i privilegi devono essere concessi a tutti i ruoli, compresi quelli che potrebbero essere creati in seguito. PUBLIC può essere pensato come un gruppo implicitamente definito che include sempre tutti i ruoli. Ogni ruolo particolare avrà la somma di privilegi concessi direttamente ad esso, privilegi concessi a qualsiasi ruolo di cui è attualmente membro e privilegi concessi a PUBLIC.

Se vuoi davvero limitare il tuo utente alle istruzioni DML, allora hai un po 'di più da fare:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;

Questi presuppongono che avrai un solo schema (che è chiamato "pubblico" per impostazione predefinita).

Come ha sottolineato Jack Douglas, quanto sopra offre solo i privilegi per le tabelle già esistenti . Per ottenere lo stesso per le tabelle future, è necessario definire i privilegi predefiniti :

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

Qui, some_roleè un ruolo che crea le tabelle, mentre user_nameè quello che ottiene i privilegi. Definendo questo, devi aver effettuato l'accesso come some_roleo un membro di esso.

E, infine, devi fare lo stesso per le sequenze (grazie a PlaidFan per averlo sottolineato): ecco il USAGEprivilegio di cui hai bisogno.


1
Grazie, è FOR some_rolestata la parte chiave che mi mancava per farlo funzionare per i miei tavoli creati in seguito. Ma non ho dovuto effettuare l'accesso come some_role, ha funzionato anche se ho eseguito la query come postgresutente amministratore predefinito .
JustAMartin,

54

supponendo che tu voglia dare loro tutti i privilegi - fai questo:

grant all privileges on database dbname to dbuser;

dove dbnameè il nome del database ed dbuserè il nome dell'utente.


44
Questo aggiungerà i seguenti privilegi sulla base di dati : CREATE, CONNECT, TEMPORARY. Nessun privilegio sui tavoli.
dezso

13
Un comando simile sarebbe per tutti i tavoli,GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci il

5
Ho trovato utile anche questo:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Paolo,

18

Garantire tutti i privilegi a tutte le tabelle all'interno del database è raggiunto con

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;

15

È possibile che stia facendo qualcosa di sbagliato qui, dato che sono molto nuovo su PostgreSQL. Ma questo ha risolto solo la prima parte del problema per me: impostare i privilegi su tutte le tabelle esistenti.

Affinché le autorizzazioni siano impostate correttamente per il mio utente su nuove tabelle, che vengono create devo impostare le autorizzazioni predefinite per l'utente:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;

2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
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.