PostgreSQL nesne izinlerini hangi sırayla kontrol eder?


16

Bir veritabanı rolü göz önüne alındığında, saklı yordam olarak tanımlanan user1bir işlev ve something()aşağıdaki gibi oluşturulan bir görünüm:

CREATE VIEW view1 AS select * from something()

Ve bu izinler verildiğinde:

REVOKE ALL ON FUNCTION something FROM user1
REVOKE SELECT ON view1 FROM user1

Koştuğumda SELECT * FROM view1bir hata alıyorum permission denied for function something().

Benim sorum, görünümdeki seçme izinlerini iptal edersem, neden işlev çağrılır? Gibi bir şey almayı bekliyordum:

permission denied for relation view1

Teşekkür ederim!


2
AFAIK, izinlerin kontrol edildiği tanımlanmış bir sıra yoktur.
Craig Ringer

@CraigRinger Teşekkürler! Sanırım bu beklenen davranış. Ben bir API görünümü açığa, ben görünüm (uygulama yerine görünüm yerine izinleri hakkında şikayet hata iletisi verilen) görünümün uygulama ayrıntılarını ifşa önlemek için çalışıyordu.
santios

1
İzinleri çok aynı moda sorgu planları (örneğin aşağıdan yukarıya) olarak değerlendirilir ve bu nedenle en düşük nesne ilk durumda değerlendirilir, hangi durumda olduğunu değerlendirilir something(). Sorguyu değiştirmek, farklı bir açıklama planı almak, izinleri buna göre ayarlamak ve ardından something()işlevde izin hatasının atılıp atılmadığını veya yeni yürütme planının nasıl yeniden değerlendirildiğini takip edip etmeyeceğini görmek için hızlı bir test olacaktır .
John Eisbrener

İşlev için izinler verir ve bunları görünümde iptal
ederseniz

Yanıtlar:


3

Bu durumda sorun tam olarak izin sırası değil, yürütme sırası ile ilgilidir.

Özgeçmişte, PostgreSQL için:

1- Tablolara erişen görünümler tablo iznini geçersiz kılar

2- Görünümlere erişim fonksiyonları, kontrol edilmeden önce tüm işlevleri değerlendirmelidir - bu nedenle görünümün erişim izinleri olmasa bile görünümün erişimine başlamadan önce işlevlerin yürütülmesi gerekir ...

Bunu nasıl ispatlayabiliriz?

Postgresql dosyasında, kullanıcı bu izinlere sahip olmasa bile görünümler size tabloda bir seçim yapma izni verebilir.

Örneğin:

create view view2 as select * from table1;
revoke all on table1 from user1;
grant select on view2 to user1; 

Kullanıcı 1 olarak oturum açın:

select * from table1 (permission denied) 
select * from view2 (sucess - the query executes)

Bu durumda, kullanıcı tablo seçme izniniz olmasa bile view2 öğesini seçebilir.

Ama ya aynı şeyi bir işlevle yaparsak ? Davranış aynı DEĞİLDİR . 1 döndürmeden önce 5 saniye bekleyecek bir işlev oluşturalım (böylece postgresql işlevi her çağırdığımızda işlevi çalıştırıyorsa hata ayıklayabiliriz)

CREATE OR REPLACE FUNCTION something() RETURNS integer
AS 'select 1 from pg_sleep(5);'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT; --this function will delay 5 seconds

create view view1 as select * from something();
revoke all on function something() from user1;
grant select on view1 to user1; 

Kullanıcı 1 olarak oturum açın:

select * from something(); (permission denied for something) 
select * from view1 (permission denied for something )

Görünümde seçme izni, işlev iznini geçersiz kılmaz ve hatta görünüm1'den izinleri iptal edersek bile, ileti, görünümün izni ne olursa olsun, postgresql'in işlev nedeniyle sorgumuzu durdurduğunu gösterir. (soruda olan tam olarak budur)

Ama önce işlev gerçekten kontrol ediliyor mu? Bu işleve 'tümü' izinleri verirsek, ancak görünüm iznini iptal edersek ...

grant all on function something to user1; 
revoke all on view1 from user1; 
select * from view1;
Delayed 5 seconds... (the function executed!) 
Permission denied for select on view1

Gördüğünüz gibi , "bir şey ()" işlevinin yürütüldüğünü göstererek görünüm çıktısı alma iznimiz olmadığını söylemeden önce 5 saniye bekledi . Bu nedenle, işlev verisi dönüşü, görünüm kontrolünden önce mevcut olmalıdır.

Şimdi bu testlerle, şimdi, sorguya devam etmeden önce tüm fonksiyonları değerlendirmek için gereken PostgreSQL'in, işlenen tüm fonksiyonlar tamamen tamamlanana kadar sorgunun hala mevcut olmadığı gibi olduğunu biliyoruz, bu nedenle görünüm postgresql için çözülemez. bunu seçmek için iznimiz olup olmadığını bilmek.

Sanırım bu sorunuzu "izin sırası" açısından cevaplıyor, ancak postgresql'nin devam etmeden önce neden tüm fonksiyonları değerlendirmesi gerekiyor, bu başka bir soru ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.