Questa pagina spiega come funziona il controllo dell'accesso granulare con le code Spanner per i database con dialetto GoogleSQL e PostgreSQL.
In Spanner, una coda è definita come oggetto schema. L'accesso per inviare messaggi, riceverli, estendere i lease dei messaggi, confermare ed eliminare messaggi o eseguire query direttamente sulle code è conforme ai ruoli e ai privilegi standard del database Spanner.
Concessioni per l'invio di messaggi (producer)
Per inviare messaggi a una coda utilizzando DML (INSERT INTO) o l'API Mutation (vedi
Istruzione Insert),
concedi il privilegio INSERT sulla coda al ruolo del database:
GoogleSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE_NAME;
Per revocare il privilegio:
GoogleSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Concessioni per la ricezione di messaggi (consumatori)
Per trasmettere in streaming i messaggi da una coda, i consumer eseguono la
funzione con valori di tabella (TVF) RECEIVE_QUEUE_NAME() con
ExecuteStreamingSQL.
Per consentire a un ruolo del database di trasmettere in streaming i messaggi dalla coda, concedi EXECUTE
alla funzione RECEIVE_QUEUE_NAME creata automaticamente:
GoogleSQL
GRANT EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME TO ROLE_NAME;
Per revocare il privilegio:
GoogleSQL
REVOKE EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME FROM ROLE_NAME;
La chiamata RECEIVE_QUEUE_NAME() richiede solo EXECUTE sul
TVF; non richiede SELECT nella coda.
Estendere i lease dei messaggi
Quando un consumatore riceve un messaggio, Spanner assegna un lease iniziale di 10 secondi. Se l'elaborazione del messaggio richiede più tempo del lease iniziale, il
consumatore deve estendere il lease utilizzando
RENEWLEASE_QUEUE_NAME() TVF.
Per estendere i lease, il ruolo deve disporre di EXECUTE sulla funzione
RENEWLEASE_QUEUE_NAME:
GoogleSQL
GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT EXECUTE ON FUNCTION spanner.renew_lease_QUEUE_NAME TO ROLE_NAME;
Per revocare il privilegio:
GoogleSQL
REVOKE EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE EXECUTE ON FUNCTION spanner.renewlease_QUEUE_NAME FROM ROLE_NAME;
La chiamata RENEWLEASE_QUEUE_NAME() richiede solo EXECUTE sul
TVF, non SELECT nella coda.
Per saperne di più sulla ricezione dei messaggi e sull'estensione dei lease, consulta la sezione Utilizzare le code.
Sovvenzioni per l'esecuzione di query dirette sulle code
Per leggere o esaminare i messaggi direttamente da una coda utilizzando SQL standard
(SELECT * FROM QUEUE_NAME) o l'API Read, concedi il privilegio
SELECT sulla coda:
GoogleSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE_NAME;
Per revocare il privilegio:
GoogleSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
La concessione di SELECT sulla coda consente di eseguire query sulla coda come tabella, ma
non concede EXECUTE su RECEIVE_QUEUE_NAME() o
RENEWLEASE_QUEUE_NAME().
Concessioni per la conferma e l'eliminazione dei messaggi
Per confermare la ricezione o eliminare i messaggi da una coda utilizzando DML (DELETE FROM) o l'API Mutation (Ack o Delete), concedi il privilegio DELETE sulla coda:
GoogleSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE_NAME;
Per revocare il privilegio:
GoogleSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Privilegi richiesti per le operazioni sulle code
La seguente tabella riepiloga i privilegi richiesti per le operazioni comuni della coda:
| Operazione | Privilegi obbligatori |
|---|---|
Inviare messaggi (DML INSERT o API Mutation Send) |
INSERT in coda |
Ricevere messaggi (RECEIVE_QUEUE_NAME() TVF) |
EXECUTE sulla funzione RECEIVE_QUEUE_NAME |
Estendi il lease del messaggio (RENEWLEASE_QUEUE_NAME() TVF) |
EXECUTE sulla funzione RENEWLEASE_QUEUE_NAME |
Riconoscere o eliminare i messaggi (DML DELETE o API Mutation Ack o Delete) |
DELETE in coda |
Leggere direttamente i dati della coda (SQL SELECT o API Read) |
SELECT in coda |
Esempio: configura i ruoli di produttore e consumatore
L'esempio seguente configura ruoli di database separati per un produttore, un
consumer e un revisore in una coda denominata OrdersQueue:
GoogleSQL
-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO ROLE queue_producer;
-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RECEIVE_OrdersQueue TO ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_OrdersQueue TO ROLE queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO ROLE queue_consumer;
-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO ROLE queue_reader;
PostgreSQL
-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO queue_producer;
-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.receive_OrdersQueue TO queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.renewlease_OrdersQueue TO queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO queue_consumer;
-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO queue_reader;
INFORMATION_SCHEMA visualizzazioni per le code
Le seguenti visualizzazioni mostrano informazioni sui ruoli e sui privilegi del database per le code:
- Database con dialetto GoogleSQL:
INFORMATION_SCHEMA.TABLE_PRIVILEGES - Database con dialetto PostgreSQL:
information_schema.table_privileges
Poiché Spanner modella le code come oggetti schema a livello di tabella, i privilegi concessi alle code vengono visualizzati in TABLE_PRIVILEGES. I privilegi concessi
sulle funzioni con valori di tabella della coda vengono visualizzati in ROUTINE_PRIVILEGES.
Le righe di queste viste vengono filtrate in base ai privilegi del ruolo del database corrente. In questo modo, le entità possono visualizzare solo i ruoli, i privilegi e le code a cui hanno accesso.
Il filtro delle righe si applica anche alle seguenti visualizzazioni dei metadati della coda:
GoogleSQL
INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.COLUMNS
PostgreSQL
information_schema.tablesinformation_schema.columns
Il filtro delle righe si applica anche alle visualizzazioni dei metadati per le funzioni con valori di tabella della coda (RECEIVE_QUEUE_NAME e
RENEWLEASE_QUEUE_NAME):
GoogleSQL
PostgreSQL
Il ruolo di sistema spanner_info_reader e i suoi membri vedono sempre un INFORMATION_SCHEMA non filtrato.
Avvertenze e considerazioni
Privilegi distinti per l'esecuzione di TVF e le query dirette sulle code: la concessione di
SELECTsulla coda non concedeEXECUTEsulle funzioni con valori di tabella (RECEIVE_QUEUE_NAMEoRENEWLEASE_QUEUE_NAME) associate. Analogamente, la concessione diEXECUTEsulla TVF non concedeSELECTsulla coda.- Se un ruolo con solo
SELECTnella coda tenta di eseguireRECEIVE_QUEUE_NAME(), Spanner restituisce un errore che indica che il ruolo non dispone dei privilegi richiesti nella funzione della tabellaRECEIVE_QUEUE_NAME. - Se un ruolo con solo
EXECUTEsul TVF tenta di eseguireSELECT * FROM QUEUE_NAME, Spanner restituisce un errore che indica che il ruolo non dispone dei privilegi richiesti nella codaQUEUE_NAME.
- Se un ruolo con solo
Differenza rispetto agli stream di modifiche: a differenza degli stream di modifiche (che richiedono sia
SELECTsullo stream siaEXECUTEsulla funzione di lettura), i consumer di messaggi in coda richiedono soloEXECUTEsulla TVFRECEIVE. Non richiedonoSELECTnella coda stessa.Privilegi a livello di colonna non supportati: a differenza delle tabelle, Spanner non supporta i privilegi a livello di colonna nelle code (ad esempio
GRANT SELECT (COLUMN_NAME) ON QUEUE). I privilegi devono essere concessi all'oggetto coda nel suo complesso perché le code includono colonne di metadati di sistema interni.Separazione dei ruoli di produttore e consumatore: consigliamo di definire ruoli di database separati per i produttori e i consumatori di messaggi. Ad esempio:
- Un ruolo di produttore con solo
INSERTin coda. - Un ruolo di consumatore con
EXECUTEsulle funzioniRECEIVE_QUEUE_NAMEeRENEWLEASE_QUEUE_NAME, oltre aDELETEsulla coda se si confermano i messaggi conDELETEo la mutazioneAck.
- Un ruolo di produttore con solo
DML diretta e TVF in coda: le istruzioni
DELETEoUPDATEignorano la macchina a stati di leasing e distribuzione della coda. Ti consigliamo di limitare questi privilegi ai ruoli amministrativi o di manutenzione.