PostgreSQL ऑब्जेक्ट अनुमतियों की जांच किस क्रम में करता है?


16

एक डेटाबेस भूमिका को देखते हुए user1, एक कार्य something()को एक संग्रहीत प्रक्रिया और एक दृश्य के रूप में परिभाषित किया गया है:

CREATE VIEW view1 AS select * from something()

और, यह अनुमति दी:

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

जब मैं दौड़ता हूं SELECT * FROM view1, मुझे एक त्रुटि मिलती है permission denied for function something()

मेरा प्रश्न यह है कि यदि मैं दृश्य पर चुनिंदा अनुमतियों को रद्द करता हूं, तो फ़ंक्शन क्यों कहा जाता है? मैं कुछ पाने की उम्मीद कर रहा था:

permission denied for relation view1

धन्यवाद!


2
AFAIK कोई परिभाषित क्रम नहीं है जिसमें अनुमतियों की जाँच की जाती है।
क्रेग रिंगर

@ क्रैगरिंगर धन्यवाद! मुझे लगता है कि तब अपेक्षित व्यवहार है। जैसा कि मैं एक एपीआई में दृश्य को उजागर कर रहा हूं, मैं दृश्य के कार्यान्वयन विवरणों को देखने से बचने की कोशिश कर रहा था (त्रुटि संदेश देखने के बजाय फ़ंक्शन की अनुमति के बारे में शिकायत करते हुए)।
संवत

1
मुझे संदेह है कि अनुमतियों का मूल्यांकन उसी फैशन क्वेरी प्लान में किया जाता है (जैसे नीचे से), और जैसे कि सबसे कम ऑब्जेक्ट का मूल्यांकन पहले किया जाता है, जो आपके मामले में something()फ़ंक्शन है। एक त्वरित परीक्षण क्वेरी को संशोधित करने के लिए होगा ताकि आपको एक अलग व्याख्या योजना मिले, तदनुसार अनुमतियों को समायोजित किया जा सके, और फिर देखें कि क्या something()फ़ंक्शन पर अनुमति त्रुटि डाली गई है या यदि यह अनुसरण करता है कि नई निष्पादन योजना का पुनर्मूल्यांकन कैसे किया जा रहा है।
जॉन एइसब्रेनर

यदि आप फ़ंक्शन पर अनुमति देते हैं और दृश्य पर उन्हें रद्द करते हैं, तो यह अंतर्निहित फ़ंक्शन के किसी भी उल्लेख को छोड़ देना चाहिए
ffflabs

जवाबों:


3

उस मामले में समस्या अनुमति आदेश के बारे में नहीं है, बल्कि निष्पादन आदेश है।

फिर से शुरू, PostgreSQL के लिए:

1- दृश्य जो तालिकाओं को स्वीकार कर रहे हैं वे तालिकाओं की अनुमति को ओवरराइड करेंगे

2- व्यूज को एक्सेप्ट करने के लिए, चेक करने से पहले सभी फंक्शन का मूल्यांकन करना होगा - इसलिए व्यू को एक्सेप्ट करने से पहले फंक्शन को एक्सेप्ट करना होगा, भले ही व्यू में परमिशन न हो ...

हम यह कैसे साबित कर सकते हैं?

Postgresql में, दृश्य आपको किसी तालिका में चयन करने की अनुमति देने में सक्षम होते हैं, भले ही उपयोगकर्ता के पास यह अनुमति न हो।

उदाहरण के लिए:

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

उपयोगकर्ता 1 के रूप में लॉग इन करें:

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

मामले में, उपयोगकर्ता तालिका का चयन करने की अनुमति नहीं होने पर भी view2 का चयन करने में सक्षम होगा।

लेकिन क्या होगा अगर हम एक फ़ंक्शन के साथ एक ही काम करते हैं ? व्यवहार समान नहीं हैं । 1 बनाने से पहले 5 सेकंड तक प्रतीक्षा करने की सुविधा देता है (इसलिए हम डिबग कर सकते हैं यदि पोस्टग्रैस्कल फ़ंक्शन को हर बार चला रहा है जिसे हम दृश्य कहते हैं)

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; 

उपयोगकर्ता 1 के रूप में लॉग इन करें:

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

दृश्य पर चयन करने की अनुमति फ़ंक्शन की अनुमति को ओवरराइड नहीं करती है, और यहां तक ​​कि सबसे खराब है अगर हम view1 से अनुमतियों को रद्द करते हैं, तो संदेश अभी भी दिखाता है कि पोस्टग्रैसेक्ल ने फ़ंक्शन के कारण हमारी क्वेरी को रोक दिया है, चाहे कोई भी दृश्य की अनुमति हो .. (यह वही है जो सवाल में हो रहा है)

लेकिन क्या वास्तव में फ़ंक्शन को पहले चेक किया जा रहा है? यदि हम फ़ंक्शन को 'सभी' अनुमति देते हैं, लेकिन दृश्य अनुमति रद्द कर दें ...

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

जैसा कि आप देख रहे हैं कि इससे पहले कि हम कुछ "(") फ़ंक्शन निष्पादित कर रहे हैं, यह दिखाने के लिए अनुमति नहीं है कि कहने से पहले पोस्टग्रैडिकल 5 सेकंडों को देखें । तो फ़ंक्शन डेटा रिटर्न दृश्य की जांच से पहले मौजूद होना चाहिए।

तो अब इस परीक्षण के साथ, अब हम जानते हैं कि PostgreSQL को हमारी क्वेरी को जारी रखने से पहले सभी कार्यों का मूल्यांकन करने की आवश्यकता है, क्या यह क्वेरी अभी भी मौजूद नहीं है जब तक कि सभी कार्य पूरी तरह से पूरा नहीं हो जाते हैं, इसलिए पोस्टग्रांसेल के लिए व्यू कैंट हल किया जा सकता है पता है कि हमारे पास इसे चुनने की अनुमति है या नहीं।

मुझे लगता है कि यह "अनुमति आदेश" के संदर्भ में आपके प्रश्न का उत्तर देता है, लेकिन पोस्टग्रेजेक को जारी रखने से पहले सभी कार्यों का मूल्यांकन करने की आवश्यकता क्यों है, यह एक और सवाल है ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.