Diberikan peran basis data,, user1
fungsi yang something()
didefinisikan sebagai prosedur tersimpan dan tampilan dibuat seperti:
CREATE VIEW view1 AS select * from something()
Dan, mengingat izin ini:
REVOKE ALL ON FUNCTION something FROM user1
REVOKE SELECT ON view1 FROM user1
Ketika saya menjalankan SELECT * FROM view1
, saya mendapatkan kesalahan permission denied for function something()
.
Pertanyaan saya adalah, jika saya mencabut izin pilih pada tampilan, mengapa fungsinya dipanggil? Saya mengharapkan untuk menerima sesuatu seperti:
permission denied for relation view1
Terima kasih!
postgresql
permissions
view
santios
sumber
sumber
something()
fungsinya. Tes cepat akan mengubah kueri sehingga Anda mendapatkan rencana menjelaskan yang berbeda, menyesuaikan izin yang sesuai, dan kemudian melihat apakah kesalahan izin dilemparkan padasomething()
fungsi atau jika mengikuti bagaimana rencana eksekusi baru sedang dievaluasi kembali.Jawaban:
Masalah dalam kasus itu bukan tentang urutan izin, tetapi urutan eksekusi.
Dalam resume, untuk PostgreSQL:
1- Tampilan yang mengakses tabel akan menimpa izin tabel
2 - Tampilan fungsi acessing, perlu mengevaluasi semua fungsi, sebelum diperiksa - jadi fungsi harus dieksekusi sebelum mengakses tampilan, bahkan jika tampilan tidak memiliki izin pilih ...
Bagaimana kita bisa membuktikannya?
Dalam postgresql, tampilan dapat memberi Anda izin untuk melakukan pemilihan dalam tabel, bahkan jika pengguna tidak memiliki izin ini.
Sebagai contoh:
Masuk sebagai pengguna 1:
Dalam hal ini, pengguna akan dapat memilih view2 bahkan tidak memiliki izin untuk memilih tabel.
Tetapi bagaimana jika kita melakukan hal yang sama dengan suatu fungsi ? Tingkah lakunya TIDAK sama. Mari kita membuat fungsi yang menunggu 5 detik sebelum mengembalikan 1 (jadi kita bisa men-debug jika postgresql menjalankan fungsi setiap kali kita memanggil tampilan)
Masuk sebagai pengguna 1:
Izin untuk melakukan pilih pada tampilan tidak mengesampingkan izin fungsi, dan bahkan terburuk jika kita mencabut izin dari view1, pesan masih menunjukkan bahwa postgresql menghentikan kueri kami karena fungsinya, tidak peduli apa pun izin tampilan tersebut. (itulah yang terjadi dalam pertanyaan)
Tetapi apakah fungsinya benar-benar diperiksa terlebih dahulu? Jika kami memberikan izin 'semua' ke fungsi, tetapi cabut izin tampilan ...
Seperti yang Anda lihat postgresql MENUNGGU 5 DETIK sebelum mengatakan bahwa kami tidak memiliki izin untuk menampilkan tampilan , menunjukkan bahwa fungsi "sesuatu ()" dijalankan. Jadi pengembalian data fungsi harus ada sebelum pemeriksaan tampilan.
Jadi sekarang dengan tes ini, kita sekarang tahu bahwa PostgreSQL perlu mengevaluasi terlebih dahulu semua fungsi sebelum melanjutkan permintaan kita, sama seperti permintaan masih belum ada sampai semua fungsi yang terlibat selesai sepenuhnya, sehingga tampilan tidak dapat dipecahkan untuk postgresql hingga tahu apakah kami memiliki atau tidak izin untuk memilihnya.
Saya pikir ini menjawab pertanyaan Anda dalam hal "urutan izin", tetapi mengapa postgresql perlu mengevaluasi semua fungsi sebelum melanjutkan, itu adalah pertanyaan lain ...
sumber