PostgreSQL: संबंध के लिए अनुमति से इनकार कर दिया


14

मैं PostgreSQL में अनुमतियों के बारे में थोड़ा उलझन में हूँ।

मेरी ये भूमिकाएँ हैं:

                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 admin     | Superuser, Create role, Create DB, Replication | {}
 meltemi   | Create role, Create DB                         | {rails}
 rails     | Create DB, Cannot login                        | {}
 myapp     |                                                | {rails}

और डेटाबेस:

                                    List of databases
        Name         | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
---------------------+--------+----------+-------------+-------------+-------------------
 myapp_production    | rails  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ...

उपयोगकर्ता को रिकॉर्ड जोड़ने और हटाने myappके myapp_productionडेटाबेस को क्वेरी करने में कोई समस्या नहीं है । मैं meltemiभी उसी डेटाबेस को क्वेरी करने में सक्षम होना चाहता हूं । इसलिए, मैंने एक भूमिका बनाई railsजो डेटाबेस का मालिक है और दोनों को meltemiऔर myappसदस्यों को बनाया है rails। लेकिन मुझे अभी भी permission denied for relationत्रुटियाँ मिलती हैं। Meltemiस्कीमा देख सकते हैं लेकिन DB को क्वेरी नहीं कर सकते।

मैंने अभी देखा ( \dtकमांड के साथ ) जो myappतालिकाओं का मालिक है:

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | events            | table | myapp
 public | schema_migrations | table | myapp
 ...
 public | users             | table | myapp
 ...

तालिकाओं को ORM (रेल्स एक्टिव एक्टिव माइग्रेशन) के माध्यम से बनाया गया था।

मुझे पता है कि PostgreSQL में प्राधिकरण बहुत अलग है (जैसा कि MySQL और अन्य मैंने इस्तेमाल किया है) के विपरीत। मुझे अपना डेटाबेस कैसे सेट करना चाहिए ताकि विभिन्न उपयोगकर्ता इसे एक्सेस कर सकें। कुछ को CRUD करने में सक्षम होना चाहिए, लेकिन अन्य केवल पढ़ने में सक्षम हो सकते हैं, आदि ...

किसी भी मदद के लिए धन्यवाद। क्षमा करें, मुझे पता है कि यह एक बहुत ही मूल प्रश्न है लेकिन मैं स्वयं इसका उत्तर नहीं खोज पाया हूँ।

जवाबों:


4

मैंने इसके बारे में अपने जवाब में सर्वरफॉल्ट पर किसी अन्य उपयोगकर्ता को पोस्टग्रैस्कल डेटाबेस पर अधिकार प्रदान करने के बारे में लिखा था ।

मूल रूप से, सबसे अच्छा समाधान जब आपके पास एक उपयोगकर्ता है और आप अन्य उपयोगकर्ताओं को समान अधिकार देना चाहते हैं, तो उस उपयोगकर्ता को एक समूह में बदलना है, मूल नाम के साथ एक नया उपयोगकर्ता बनाएं जो समूह का सदस्य है, और उस समूह को अन्य उपयोगकर्ताओं को भी अनुदान दें।

तो आपके मामले में, railsकहने के लिए नाम बदल दिया जाता है myapp_users, फिर आप एक नई लॉगिन भूमिका (उपयोगकर्ता) बनाते हैं जिसका नाम है railsऔर GRANT myapp_users TO rails। अब आप ए GRANT myapp_users TO meltemi। नए railsखाते और meltemiउपयोगकर्ता दोनों के पास अब पुराने railsखाते के अधिकार हैं।

अधिक महीन दाने वाले नियंत्रण के लिए मैं ususally सलाह देता हूं कि आप दिन-प्रतिदिन लॉगिन करने वाले उपयोगकर्ताओं या उनके समूहों को तालिकाओं के स्वामित्व देने से बचें। उन्हें एक ऐसे NOINHERITसमूह के माध्यम से पहुंच प्रदान करें, जिसे उन्हें स्पष्ट रूप SET GROUPसे या बेहतर होना चाहिए , डीडीएल और GRANTएस जैसे विशेषाधिकार प्राप्त कार्यों के लिए एक पूरी तरह से अलग उपयोगकर्ता का उपयोग करें । दुर्भाग्य से यह रेल के साथ काम नहीं करता है, क्योंकि रेल को जब भी ऐसा लगता है माइग्रेशन लागू करना पसंद करते हैं और AFAIK आपको माइग्रेशन चलाने के लिए एक अलग, अधिक-विशेषाधिकार प्राप्त उपयोगकर्ता को निर्दिष्ट करने की क्षमता नहीं देता है।


ठीक है, आप जिस पोस्ट से जुड़े हैं, उसे पढ़ें; बहुत मददगार! अब, अगर मैं चीजों को सही समझ रहा हूं, तो मुझे लगता है कि आप ऊपर के myappबजाय उपयोग करने के लिए हो सकते हैं rails? क्योंकि myappतालिकाओं का स्वामी है (मैंने कभी यह निर्दिष्ट नहीं किया है कि, माइग्रेशन होना आवश्यक है)। वैसे भी, यह समझ में आता है कि अगर मेरा नाम बदल दिया myappजाता है myapp_groupऔर फिर एक नया उपयोगकर्ता बना दिया जाता है myappजो रेल एप्लिकेशन को DB से कनेक्ट करने के लिए उपयोग करेगा। भूमिका के दोनों सदस्यों myappको मौजूदा और मौजूदा बनाएं । लेकिन क्या होता है जब मैं अगला प्रवास चलाता हूं। यह फिर से समस्या को फिर से बनाने के स्वामित्व में नहीं होगा ?!? meltemimyapp_groupmyapp
मुलतेमी

1
आपको यह समझना चाहिए कि PostgreSQL में केवल roles(संस्करण 8.1 के बाद से) है। शर्तों userऔर groupऐतिहासिक कारणों और अनुकूलता के लिए चारों ओर रखा जाता है। मूल रूप से एक "समूह" लॉगिन विशेषाधिकार के बिना एक भूमिका है। आप प्रदान कर सकते हैं myappकरने के लिए meltemiभले ही myappसिर्फ एक और "उपयोगकर्ता" है। यहां मैनुअल पढ़कर शुरुआत करें
एरविन ब्रांडस्टेट्टर

मैं Postgres में rolesबनाम groupsबनाम usersअलगाव को समझता हूं , कम से कम मुझे लगता है कि मैं करता हूं। ऊपर गलत (और भ्रामक) शब्दावली का उपयोग करने के लिए क्षमा करें। लेकिन मुझे अभी तक समझ में नहीं आया है कि अपने डेटाबेस को कैसे स्थापित किया जाए ताकि डेटाबेस और दो लॉगिन भूमिकाओं पर नो-लॉगिन भूमिका हो myappऔर meltemiदोनों की पूरी पहुंच हो। उन भूमिकाओं में myappसे एक अनिवार्य रूप से रेल माइग्रेशन चला रही होगी, जो एक नई तालिका बना रही है, एक बार फिर myapp, एक लॉगिन उपयोगकर्ता के स्वामित्व में । क्या मुझे सिर्फ meltemiएक 'सदस्य' बनाना चाहिए myappऔर इसके साथ क्या करना चाहिए ? लेकिन यह सिर्फ हास्यास्पद लगता है ... नहीं?
मुल्तेमी

1
@Meltemi: आप सभी विशेषाधिकार है कि देना चाहते हैं myappके लिए रखती है meltemi, तो है कि ऐसा करना सही होगा। यदि आप meltemiविशेषाधिकारों का केवल एक सबसेट प्राप्त करना चाहते हैं , तो यह नहीं होगा। फिर विशेषाधिकारों के सेट को धारण करने के लिए एक समूह भूमिका बनाएँ और उसको अनुदान दें meltemi। आप शायद एसओ पर इस संबंधित प्रश्न में रुचि लेंगे । मैंने समझाते हुए उत्तर दियाDEFAULT PRIVILEGES
एरविन ब्रैंडस्टैटर

@ मैल्तेमी हां, हमेशा की तरह रेल प्रवासियों ने चित्र को जटिल बना दिया। रेल वास्तव में आपको माइग्रेशन चलाने के लिए एक अलग उपयोगकर्ता खाते को निर्दिष्ट करने देना चाहिए । आप संभवतः SET ROLEअपने माइग्रेशन की शुरुआत और RESET ROLEअंत तक एक कमांड जोड़ सकते हैं , लेकिन मैं रेल को पूरी तरह से क्रम में चलाने के लिए रेल पर भरोसा नहीं करूंगा। इरविन का अधिकार; इस मामले में सबसे अच्छा वर्कअराउंड GRANTउपयोगकर्ता के लिए होगा दूसरे के लिए एक समूह के रूप में 1 उपयोगकर्ता का उपयोग करके, रेल उपयोगकर्ता दूसरे उपयोगकर्ता को स्वामित्व देता है।
क्रेग रिंगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.