मैं एक वेब-अनुप्रयोग का समर्थन करने वाले बहु-किरायेदार डेटाबेस में नई पंक्ति स्तर सुरक्षा सुविधा का उपयोग करने का सबसे अच्छा तरीका समझने के लिए तैयार हूं।PostgreSQL 9.5 - पंक्ति स्तर सुरक्षा/ROLE सर्वोत्तम प्रथाओं
वर्तमान में, इस एप्लिकेशन के अनुसार कुछ अलग-अलग ROLE उपलब्ध हैं, जो उस क्रिया के आधार पर उपलब्ध है।
एक बार जब एप्लिकेशन अपने स्वयं के ROLE का उपयोग कर कनेक्शन बनाता है, तो एप्लिकेशन उपयोगकर्ता द्वारा समर्थित प्रमाणीकरण पैरामीटर के आधार पर पंक्तियों को फ़िल्टर करने वाले विभिन्न कार्यों में प्रमाणीकरण पैरामीटर (उपयोगकर्ता द्वारा प्रदान किया जाता है) पास करता है। प्रणाली हजारों उपयोगकर्ताओं के साथ काम करने के लिए डिज़ाइन की गई है और ऐसा लगता है कि यह काम करता है; हालांकि, यह बदनाम रूप से घबराहट (और धीमी) है।
ऐसा लगता है कि अगर मैं नई पंक्ति स्तर की सुरक्षा सुविधा का उपयोग करना चाहता हूं तो मुझे डेटाबेस तक पहुंचने के लिए प्रत्येक वास्तविक दुनिया उपयोगकर्ता (केवल वेब एप्लिकेशन के लिए) के लिए एक नया ROLE बनाना होगा।
क्या यह सही है? और यदि हां, तो क्या डेटाबेस में हजारों ROLEs बनाना एक अच्छा विचार है? अब
CREATE USER application;
CREATE TABLE t1 (id int primary key, f1 text, app_user text);
INSERT INTO t1 VALUES(1,'a','bob');
INSERT INTO t1 VALUES(2,'b','alice');
ALTER TABLE t1 ENABLE ROW LEVEL SECURITY;
CREATE POLICY P ON t1 USING (app_user = current_setting('app_name.app_user'));
GRANT SELECT ON t1 TO application;
SET SESSION AUTHORIZATION application;
SET app_name.app_user = 'bob';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
1 | a | bob
(1 row)
SET app_name.app_user = 'alice';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
2 | b | alice
(1 row)
SET app_name.app_user = 'none';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
(0 rows)
, मैं current_setting('app_name.app_user')
द्वारा संदेह में हूँ के रूप में मैं थोड़ा कम था: टिप्पणी में a_horse_with_no_name के लिंक से
अद्यतन (धन्यवाद, कि धागे पर जगह है) इंप्रेशन यह केवल कॉन्फ़िगरेशन पैरामीटर के लिए था ... app_name
कहां परिभाषित किया गया है?
http://www.postgresql.org/message-id/[email protected] –
@a_horse_with_no_name - इसे धन्यवाद, धन्यवाद; हालांकि, धागे में दिया गया उदाहरण थोड़ा सा गूढ़ है ... मैंने सवाल अपडेट किया है। – losthorse
यह ** ** "कॉन्फ़िगरेशन" पैरामीटर के लिए है। इसके लिए उनका उपयोग अनिवार्य रूप से एक "हैक" है। आपको उन्हें हाथ से पहले परिभाषित करने की आवश्यकता नहीं है - यह गतिशील रूप से किया जा सकता है। ध्यान दें कि 'current_setting (' app_name.app_user ')' के परिणामस्वरूप पैरामीटर को पहले परिभाषित नहीं किया गया है। इसे रोकने के लिए, आप 'postgresql.conf' में एक डमी मान को परिभाषित कर सकते हैं –