Halaman ini menjelaskan cara kerja kontrol akses terperinci dengan antrean Spanner untuk database dialek GoogleSQL dan database dialek PostgreSQL.
Di Spanner, antrean ditentukan sebagai objek skema. Akses untuk mengirim pesan, menerima pesan, memperpanjang masa berlaku pesan, mengonfirmasi dan menghapus pesan, atau mengkueri antrean secara langsung sesuai dengan peran dan hak istimewa database Spanner standar.
Pemberian untuk mengirim pesan (produsen)
Untuk mengirim pesan ke antrean menggunakan DML (INSERT INTO) atau Mutation API (lihat
Pernyataan insert),
berikan hak istimewa INSERT pada antrean ke peran database:
GoogleSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE_NAME;
Untuk mencabut hak istimewa:
GoogleSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Pemberian izin untuk menerima pesan (konsumen)
Untuk mengalirkan pesan dari antrean, pekerja konsumen menjalankan fungsi bernilai tabel (TVF) RECEIVE_QUEUE_NAME() dengan ExecuteStreamingSQL.
Untuk mengizinkan peran database melakukan streaming pesan dari antrean, berikan EXECUTE
pada fungsi RECEIVE_QUEUE_NAME yang dibuat secara otomatis:
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;
Untuk mencabut hak istimewa:
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;
Panggilan RECEIVE_QUEUE_NAME() hanya memerlukan EXECUTE di
TVF; tidak memerlukan SELECT di antrean.
Memperpanjang masa sewa pesan
Saat konsumen menerima pesan, Spanner akan menetapkan masa berlaku awal selama 10 detik. Jika pemrosesan pesan membutuhkan waktu lebih lama daripada masa sewa awal, konsumen harus memperpanjang masa sewa menggunakan TVF RENEWLEASE_QUEUE_NAME().
Untuk memperpanjang masa berlaku, peran harus memiliki EXECUTE pada fungsi
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;
Untuk mencabut hak istimewa:
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;
Panggilan RENEWLEASE_QUEUE_NAME() hanya memerlukan EXECUTE di TVF; tidak memerlukan SELECT di antrean.
Untuk mengetahui informasi selengkapnya tentang menerima pesan dan memperpanjang masa berlaku, lihat Menggunakan antrean.
Pemberian untuk mengkueri antrean secara langsung
Untuk membaca atau memeriksa pesan langsung dari antrean menggunakan SQL standar (SELECT * FROM QUEUE_NAME) atau Read API, berikan hak istimewa SELECT pada antrean:
GoogleSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE_NAME;
Untuk mencabut hak istimewa:
GoogleSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Pemberian SELECT pada antrean memungkinkan kueri antrean sebagai tabel, tetapi tidak memberikan EXECUTE pada RECEIVE_QUEUE_NAME() atau RENEWLEASE_QUEUE_NAME().
Pemberian izin untuk mengonfirmasi dan menghapus pesan
Untuk mengonfirmasi atau menghapus pesan dari antrean menggunakan DML (DELETE FROM) atau
Mutation API (Ack atau Delete), berikan hak istimewa DELETE pada antrean:
GoogleSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE_NAME;
Untuk mencabut hak istimewa:
GoogleSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;
PostgreSQL
REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE_NAME;
Hak istimewa yang diperlukan untuk operasi antrean
Tabel berikut merangkum hak istimewa yang diperlukan untuk operasi antrean umum:
| Operasi | Hak istimewa yang diperlukan |
|---|---|
Mengirim pesan (DML INSERT atau Mutation API Send) |
INSERT dalam antrean |
Menerima pesan (RECEIVE_QUEUE_NAME() TVF) |
EXECUTE pada fungsi RECEIVE_QUEUE_NAME |
Memperpanjang masa berlaku pesan (RENEWLEASE_QUEUE_NAME() TVF) |
EXECUTE pada fungsi RENEWLEASE_QUEUE_NAME |
Mengonfirmasi atau menghapus pesan (DML DELETE atau Mutation API Ack atau Delete) |
DELETE dalam antrean |
Membaca data antrean secara langsung (SQL SELECT atau Read API) |
SELECT dalam antrean |
Contoh: Mengonfigurasi peran produsen dan konsumen
Contoh berikut mengonfigurasi peran database terpisah untuk produsen, konsumen, dan auditor pada antrean bernama 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 tampilan untuk antrean
Tampilan berikut menunjukkan informasi peran dan hak istimewa database untuk antrean:
- Database dialek GoogleSQL:
INFORMATION_SCHEMA.TABLE_PRIVILEGES - Database dialek PostgreSQL:
information_schema.table_privileges
Karena Spanner memodelkan antrean sebagai objek skema tingkat tabel, hak istimewa yang diberikan pada antrean muncul di TABLE_PRIVILEGES. Hak istimewa yang diberikan
pada fungsi bernilai tabel antrean muncul di ROUTINE_PRIVILEGES.
Baris dalam tampilan ini difilter berdasarkan hak istimewa peran database saat ini. Hal ini memastikan bahwa akun utama hanya dapat melihat peran, hak istimewa, dan antrean yang dapat diaksesnya.
Pemfilteran baris juga berlaku untuk tampilan metadata antrean berikut:
GoogleSQL
INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.COLUMNS
PostgreSQL
information_schema.tablesinformation_schema.columns
Pemfilteran baris juga berlaku untuk tampilan metadata fungsi bernilai tabel antrean (RECEIVE_QUEUE_NAME dan
RENEWLEASE_QUEUE_NAME):
GoogleSQL
PostgreSQL
Peran sistem spanner_info_reader dan anggotanya selalu melihat INFORMATION_SCHEMA yang tidak difilter.
Peringatan dan pertimbangan
Hak istimewa yang berbeda untuk eksekusi TVF dan kueri antrean langsung: Memberikan
SELECTpada antrean tidak memberikanEXECUTEpada fungsi bernilai tabel (RECEIVE_QUEUE_NAMEatauRENEWLEASE_QUEUE_NAME) terkait. Demikian pula, memberikanEXECUTEpada TVF tidak memberikanSELECTpada antrean.- Jika peran yang hanya memiliki
SELECTdalam antrean mencoba menjalankanRECEIVE_QUEUE_NAME(), Spanner akan menampilkan error yang menyatakan bahwa peran tersebut tidak memiliki hak istimewa yang diperlukan pada fungsi tabelRECEIVE_QUEUE_NAME. - Jika peran dengan hanya
EXECUTEdi TVF mencoba menjalankanSELECT * FROM QUEUE_NAME, Spanner akan menampilkan error yang menyatakan bahwa peran tidak memiliki hak istimewa yang diperlukan pada antreanQUEUE_NAME.
- Jika peran yang hanya memiliki
Perbedaan dari aliran perubahan: Tidak seperti aliran perubahan (yang memerlukan
SELECTpada aliran danEXECUTEpada fungsi baca), konsumen pesan antrean hanya memerlukanEXECUTEpada TVFRECEIVE. Tidak memerlukanSELECTpada antrean itu sendiri.Hak istimewa tingkat kolom tidak didukung: Tidak seperti tabel, Spanner tidak mendukung hak istimewa tingkat kolom pada antrean (seperti
GRANT SELECT (COLUMN_NAME) ON QUEUE). Hak istimewa harus diberikan pada objek antrean secara keseluruhan karena antrean mencakup kolom metadata sistem internal.Pemisahan peran produsen dan konsumen: Sebaiknya tentukan peran database terpisah untuk produsen pesan dan konsumen pesan. Contoh:
- Peran produser dengan hanya
INSERTdalam antrean. - Peran konsumen dengan
EXECUTEpada fungsiRECEIVE_QUEUE_NAMEdanRENEWLEASE_QUEUE_NAME, sertaDELETEpada antrean jika mengonfirmasi pesan denganDELETEatau mutasiAck.
- Peran produser dengan hanya
Pengiriman DML Langsung vs. TVF dalam antrean: Pernyataan
DELETEatauUPDATElangsung melewati leasing antrean dan mesin status pengiriman. Sebaiknya batasi hak istimewa ini untuk peran administratif atau pemeliharaan.