Kapan hak istimewa terdaftar di \ l dan kapan tidak?

10

Kapan hak akses terdaftar oleh \ l, dan kapan tidak? Hak akses yang terdaftar oleh \ l dapat berubah setelah hibah dan mencabut:

$ createuser -EP my_readonly
$ psql development
development=# \l
                                           List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------------------+----------+----------+-------------+-------------+-----------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
...
development=# grant usage on schema public to my_readonly;
development=# grant connect on database development to my_readonly;
development=# \l
                                             List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |     Access privileges      
-----------------------------+----------+----------+-------------+-------------+----------------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/vagrant               +
                             |          |          |             |             | vagrant=CTc/vagrant       +
                             |          |          |             |             | my_readonly=c/vagrant
...
development=# revoke connect on database development from my_readonly;
REVOKE
development=# revoke usage on schema public from my_readonly;
REVOKE
development=# \l
                                           List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------------------+----------+----------+-------------+-------------+-----------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/vagrant          +
                             |          |          |             |             | vagrant=CTc/vagrant

Mengapa demikian? Status apa yang berubah? Saya percaya kemampuan pengguna my_readonly untuk terhubung tidak berubah melalui seluruh sesi psql ini (karena saya menduga peran PUBLIC memiliki hak istimewa terhubung), tetapi jelas ada sesuatu yang berubah: benda apa itu?

Side pertanyaan: bagaimana saya bisa secara eksplisit meminta postgres apakah PUBLIC sebenarnya tidak memiliki hak connect (mereka mungkin telah dicabut - lihat Mengapa pengguna baru dapat memilih dari setiap meja? )?

Langshan Croad
sumber

Jawaban:

4

Perintah backslash di psql adalah pintasan untuk kueri atau kueri yang memeriksa katalog sistem. The \lperintah melihat informasi di pg_catalog.pg_database, khusus, query ini:

SELECT d.datname as "Name",
   pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
   pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
   d.datcollate as "Collate",
   d.datctype as "Ctype",
   pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;

Anda bisa psqlmemperlihatkan apa yang digunakannya untuk perintah backslash dengan -Emengibarkan bendera ketika Anda memintanya di baris perintah.

Jika izin pada database atau objek lain adalah default yang dibuat PostgreSQL, *aclkolom akan menjadi NULL. Jika Anda mengubah default, seperti yang Anda miliki, kolom ACL akan diisi dengan informasi yang terkait dengan GRANTdan / atau REVOKEpernyataan yang telah Anda jalankan.

Anda dapat melihat izin / ACL secara khusus melalui salah satu \zatau\dp

Jika Anda membaca lebih lanjut di sini:

http://www.postgresql.org/docs/9.4/static/sql-grant.html

Jika Anda menggulir ke bawah, (atau mencari kata psql), Anda dapat melihat tabel yang menunjukkan kepada Anda bagaimana menafsirkan ACL yang Anda lihat dengan \latau di kolom ACL.

Sebagai contoh:

=Tc/vagrant

berarti bahwa PUBLIC (peran implisit yang berisi semua peran) memiliki izin untuk membuat tabel sementara Tdan terhubung c, karena garis ACL =xxxxxmenunjukkan izin yang diterapkan pada PUBLIC, sementara rolname=xxxxberlaku untuk peran tertentu.

Presentasi dari Dalibo ini juga harus membantu memperjelas hal ini lebih lanjut: Mengelola Hak dalam PostgreSQL

Semoga itu bisa membantu. =)

Kassandry
sumber