MongoDB - व्यवस्थापक उपयोगकर्ता अधिकृत नहीं है


200

मैं अपने MongoDB में प्राधिकरण जोड़ने की कोशिश कर रहा हूं।
मैं MongoDB 2.6.1 के साथ लिनक्स पर यह सब कर रहा हूं।
मेरी mongod.conf फ़ाइल पुराने संगतता प्रारूप में है
(यह इस प्रकार है कि यह संस्थापन के साथ आया था)।

1) मैंने यहाँ (3) में वर्णित के रूप में व्यवस्थापक उपयोगकर्ता बनाया

http://docs.mongodb.org/manual/tutorial/add-user-administrator/

2) फिर मैंने इस लाइन को अनलॉन्ग करके mongod.conf को एडिट किया

auth = true

3) अंत में मैंने मंगोल सेवा को रिबूट किया और मैंने इसके साथ लॉगिन करने की कोशिश की:

/usr/bin/mongo localhost:27017/admin -u sa -p pwd

4) मैं कनेक्ट कर सकता हूं लेकिन कनेक्ट होने पर यह कहता है।

MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:47:16 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command { getLog: "startupWarnings" }

5) अब ऐसा लगता है कि saमैंने जो उपयोगकर्ता बनाया है उसकी कोई अनुमति नहीं है।

root@test02:~# mc
MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:57:03 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command { getLog: "startupWarnings" }
[admin] 2014-05-29 17:57:03.011 >>> use admin
switched to db admin
[admin] 2014-05-29 17:57:07.889 >>> show collections
2014-05-29T17:57:10.377-0400 error: {
        "$err" : "not authorized for query on admin.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
[admin] 2014-05-29 17:57:10.378 >>> use test
switched to db test
[test] 2014-05-29 17:57:13.466 >>> show collections
2014-05-29T17:57:15.930-0400 error: {
        "$err" : "not authorized for query on test.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
[test] 2014-05-29 17:57:15.931 >>>

समस्या क्या है? मैंने इस पूरी प्रक्रिया को 3 बार दोहराया और
मुझे लगता है कि मैंने यह सब MongoDB डॉक्स में निर्दिष्ट किया है। लेकिन यह काम नहीं करता है।
मैं उम्मीद कर रहा था कि इस saउपयोगकर्ता को कुछ भी करने के लिए अधिकृत किया जाएगा ताकि
वह फिर अन्य उपयोगकर्ताओं को बना सके और उन्हें अधिक विशिष्ट अनुमति दे सके।


20
यह बहुत कष्टप्रद या बुरी तरह से प्रलेखित है। मैं वहां खुद संघर्ष कर रहा था। अंत में, मेरे पास वैश्विक "रूट" भूमिका वाला एक उपयोगकर्ता है, जो अभी भी कुछ चीजें नहीं कर सकते हैं जैसे कमांड निष्पादित करना ...
ToBe

जवाबों:


474

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

use admin
db.createUser(
  {
    user: 'admin',
    pwd: 'password',
    roles: [ { role: 'root', db: 'admin' } ]
  }
);
exit;

यदि आपने पहले ही adminउपयोगकर्ता बना लिया है, तो आप इस तरह भूमिका बदल सकते हैं:

use admin;
db.grantRolesToUser('admin', [{ role: 'root', db: 'admin' }])

संपूर्ण प्रमाणीकरण सेटिंग संदर्भ के लिए, उन चरणों को देखें जिन्हें मैंने इंटरनेट पर घंटों के शोध के बाद संकलित किया है।


154
WTF ?! इस तरह एक बेवकूफ के लिए एक घंटे खो दिया है। वे userAdminAnyDatabaseइसके बजाय प्रलेखन में क्यों डालते हैं root?
अकोस्टैडिनोव 12

15
विचार यह है कि आप पहले एक ऐसा उपयोगकर्ता बनाते हैं, जिसका उपयोग केवल अन्य उपयोगकर्ताओं के प्रशासन के लिए किया जाता है (इसलिए "userAdmin" से शुरू होने वाली भूमिका) और उसके बाद ही अपने सामान्य उपयोगकर्ता बनाएं। यह समझ में आता है, लेकिन मुझे यह पहली बार भी ठीक नहीं लगा ... @akostadinov
TomTasche

10
यह मेरे लिए MongoDB v3.4.7 पर काम नहीं किया:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
16:12 पर user124384

2
@ मेरे लिए यह कोड DID काम करता है: db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])और यह मुझे भ्रमित करता है। मैं एक कमांड चलाने के लिए अधिकृत नहीं हूं, और फिर भी मैं खुद को रूट बनाने के लिए एक कमांड चला सकता हूं, और फिर उस कमांड को चला सकता हूं । बहुत अजीब: एस

2
उन लोगों के लिए जो db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])काम नहीं करते थे, सुनिश्चित करें कि आप वापस स्विच करें use admin... एक ही मुद्दा था, एक बार जब मैंने वापस स्विच किया तो यह एक आकर्षण की तरह काम किया
esko22

37

यह थोड़ा भ्रामक है - मेरा मानना ​​है कि डेटाबेस को क्वेरी करने के लिए आपको खुद को पढ़ने की आवश्यकता होगी। डॉडमिन या उपयोगकर्ताडैमिन वाला उपयोगकर्ता डेटाबेस को प्रशासित कर सकता है (अपने आप को अतिरिक्त अधिकार देने सहित), लेकिन प्रश्न नहीं कर सकता है या डेटा नहीं लिख सकता है।

इतना अनुदान खुद पढ़ें और आपको ठीक होना चाहिए -

http://docs.mongodb.org/manual/reference/built-in-roles/#readWrite


मुझे यकीन नहीं है कि यह उत्तर प्रश्न के लिए प्रासंगिक है, लेकिन किसी भी तरह से यह गलत जानकारी प्रदान करता है। DbOwner भूमिका में readWrite भूमिका शामिल है: docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
एंडी

10
उत्तर सही है - डडमिन और उपयोगकर्ताडैम भूमिकाएं (जो कि मूल पोस्टर के बारे में पूछा गया है) में रीडराइट शामिल नहीं है। DbOwner करता है लेकिन वह नहीं है जो मूल पोस्टर का उपयोग कर रहा था और के बारे में पूछ रहा था।
जॉन पेट्रोन

3
आप बिल्कुल सही कह रहे है। क्षमा याचना। मैंने बहुत लंबी भूमिकाएँ निभाईं और बहुत परेशान रहा।
एंडी ट्रिग्स

तो आपके पास वास्तविक मोंगोडब सर्वर तक पहुंचने के लिए एक व्यवस्थापक उपयोगकर्ता हो सकता है, और फिर विशिष्ट डेटाबेस के लिए अन्य हैं?
के - एसओ में विषाक्तता बढ़ रही है।

32

वर्तमान उपयोगकर्ता को बदलने के लिए शायद एक त्वरित उदाहरण किसी के लिए उपयोगी होगा। यह वही है जो मैं वास्तव में देख रहा था।

@JohnPetrone मैं के बाद सलाह जोड़ा ReadWrite के साथ अपने व्यवस्थापक उपयोगकर्ता के लिए भूमिका grantRolesToUser

> use admin
> db.grantRolesToUser("admin",["readWrite"])
> show collections
system.users
system.version

26

आप कोशिश कर सकते हैं: --authenticationDatabase ध्वज का उपयोग करना मदद करता है।

mongo --port 27017 -u "admin" -p "password" --authenticationDatabase "admin"

9

मुझे पता है कि यह उत्तर वास्तव में इस धागे पर देर से आ रहा है लेकिन मुझे आशा है कि आप इसकी जांच करेंगे।

आपके द्वारा उस त्रुटि को प्राप्त करने का कारण उस विशिष्ट भूमिका पर आधारित है जिसे आपने उपयोगकर्ता को प्रदान किया था, जिसे आपने अब तक इकट्ठा किया है, और हाँ उस उपयोगकर्ता को यह भूमिका देने से rootआपकी समस्या का समाधान हो जाएगा, लेकिन आपको पहले यह समझना होगा कि ये भूमिकाएँ उन्हें देने से ठीक पहले क्या करती हैं। उपयोगकर्ताओं के लिए।

ट्यूटोरियल में आपने उपयोगकर्ता को userAdminAnyDatabaseभूमिका दी है जो मूल रूप से उपयोगकर्ता को आपके सभी डेटाबेस के उपयोगकर्ताओं को प्रबंधित करने की क्षमता देता है। आप अपने उपयोगकर्ता के साथ जो करने की कोशिश कर रहे थे वह उसकी भूमिका की परिभाषा से बाहर था।

rootभूमिका इस भूमिका यह परिभाषा के साथ-साथ में शामिल है readWriteAnyDatabase, dbAdminAnyDatabaseयह एक सुपर उपयोगकर्ता बनाने और अन्य भूमिकाओं (मूल रूप से, क्योंकि आप इसके साथ कुछ भी कर सकते हैं)।

आप यह देखने के लिए कि आपको किन उपयोगकर्ताओं को कुछ कार्यों को पूरा करने की आवश्यकता होगी, भूमिका की परिभाषाएँ देख सकते हैं। https://docs.mongodb.com/manual/reference/built-in-roles/ यह आपके सभी उपयोगकर्ताओं को सुपर बनाने की सलाह नहीं है :)


तो, अगर जड़ नहीं है, तो आप समस्या को हल करने के लिए क्या भूमिका सुझाते हैं?
हेंडी इरावन

नमस्ते @HendyIrawan, मैं आपको सुझाव दूंगा कि आप यह तय करें कि आप वास्तव में क्या चाहते हैं कि आपके प्रत्येक उपयोगकर्ता ऐसा कर सके और उन्हें वह भूमिका दे सके जो उन्हें केवल वही करने में सक्षम बनाती है। उदाहरण के लिए यदि आप केवल एक उपयोगकर्ता को पढ़ना चाहते हैं (जो कि प्रश्न के साथ करने की कोशिश करता है show collections) तो आपको उसे यह क्षमता देनी चाहिए और कुछ नहीं roles: [ { role: "read", db: "admin" } ]। ध्यान दें कि यहां भूमिका को पढ़ा जाता है, यह डेटाबेस विशिष्ट है और आप कुछ भी नहीं कर सकते हैं लेकिन ऐसा है। अन्य भूमिकाओं के लिए इस लिंक की जाँच करें docs.mongodb.com/manual/reference/built-in-roles
el Punch

तो यहां सवाल का जवाब (उदाहरण के लिए "नहीं") "पढ़ा" है?
हेंडी इरावन

हाँ। ध्यान दें कि उपयोगकर्ता के पास केवल निर्दिष्ट db को पढ़ने की क्षमता होगी।
एल पंच

2

यह एक साधारण सवाल है।

  1. यह महत्वपूर्ण है कि आप लक्ष्य db नहीं व्यवस्थापक स्विच करें ।

अपनेDB का उपयोग करें

  1. द्वारा अपने DB प्रमाणीकरण की जाँच करें

उपयोगकर्ताओं को दिखाएं

  1. यदि आपको एक {} खाली वस्तु मिलती है जो कि प्रश्न है। आपको बस टाइप करना है

db.createUser ({उपयोगकर्ता: "yourUser", pwd: "पासवर्ड", भूमिकाएँ: ["readWrite", "dbAdmin"]})

या

db.grantRolesToUser ('yourUser', [{role: "dbAdmin", db: "yourDB"}]]


0

विंडोज पर्यावरण पर मुझे यहाँ एक समान समस्या थी: मैंने बिटनामी ड्रीमफैक्ट को स्थापित किया है और यह एक अन्य MongoDb भी स्थापित करता है जिसे सिस्टम बूट पर शुरू किया गया है। मैं अपना MongoDbService चला रहा था (जो बिना किसी त्रुटि के शुरू किया गया था) लेकिन मैंने बहुत समय गंवाने के बाद देखा कि मैं वास्तव में Bitnami के MongoDb सेवा से जुड़ रहा था। कृपया, देख लें कि कहीं आपके सर्वर पर मूंगफीडीबी का दूसरा उदाहरण तो नहीं चल रहा है।

शुभ लाभ!


2
मुझे नहीं पता कि यह जवाब क्यों दिया गया था; यह एक वैध सुझाव है। उदाहरण के लिए, मैं एक प्रबंधन कंसोल में दौड़ गया हूं जो टॉमकैट को हुड के नीचे चला रहा था। यदि आप एक स्थानीय सर्वर (किसी भी प्रकार का) शुरू करते हैं, तो आप इसे कनेक्ट करने की कोशिश करके चल रहे हैं, तो आप इसकी जांच करेंगे। वह पहला कनेक्शन सफल होगा। फिर आप अपने सर्वर के लॉग की जांच करने से पहले "छिपे हुए" सर्वर के साथ कुश्ती करेंगे और सूचित करेंगे कि आपका सर्वर वांछित पोर्ट से नहीं जुड़ सकता है।
पॉल

0

इसके अलावा, ध्यान दें कि यदि आपका मैंगो शेल क्लाइंट सही से कनेक्ट करने में विफल रहता है mongod उदाहरण लिए , तो आप ऐसी "अनुमति अस्वीकृत" त्रुटियां प्राप्त कर सकते हैं।

सुनिश्चित करें कि आपका क्लाइंट कनेक्शन पोर्ट की जाँच करके एक कनेक्शन खोलता है, लेकिन यह भी कि आप जिस पोर्ट का उपयोग कर रहे हैं वह उपयोग में mongodनहीं है। आप --port <port>शेल और प्रक्रिया दोनों में पैरामीटर का उपयोग करके एक अलग पोर्ट सेट कर सकते हैं ।


0

मेरे पास यह समस्या थी क्योंकि मेरे MongoDB कंपास में होस्टनाम मेरे प्रोजेक्ट के लिए प्रशासित करने के लिए इंगित कर रहा था। होस्टनाम के बाद / प्रोजेक्टनाम जोड़कर तय किया गया :) यह कोशिश करें:

  1. में अपनी परियोजना चुनें MongoDB एटलस वेबसाइट
  2. कनेक्ट / MongoDB कम्पास के साथ कनेक्ट करें
  3. कम्पास डाउनलोड करें / अपना ओएस चुनें
  4. मैंने कम्पास 1.12 या बाद का उपयोग किया
  5. कम्पास 1.12 या बाद के तहत कनेक्शन स्ट्रिंग की प्रतिलिपि बनाएँ।
  6. ओपन MongoDB कम्पास / कनेक्ट (ऊपर बाएं) / कनेक्ट करने के लिए
  7. कनेक्शन स्ट्रिंग का पता चला / हाँ /
  8. होस्टनाम के बाद अपने प्रोजेक्ट के नाम जोड़ें: cluster9-foodie.mongodb.net/ ProjectName
  9. कनेक्ट और POSTMAN के साथ एपीआई का परीक्षण किया।
  10. सफल होते हैं।

अपने कोड में भी उसी कनेक्शन स्ट्रिंग का उपयोग करें:

  1. इससे पहले:
    • mongodb + srv: // प्रोजेक्टनेम : पासवर्ड @ क्लस्टर9-foodie.mongodb.net / व्यवस्थापक
  2. उपरांत:
    • MongoDB + SRV: // ProjectName: पासवर्ड @ cluster9-foodie.mongodb.net / ProjectName

सौभाग्य।


0

mydb
db.createUser ({user: "test", pwd: "secret", रोल्स: ["readWrite", "dbAdmin"], passwordDigestor: "server"} का उपयोग करें


0

सहमत हैं कि आपको db और व्यवस्थापक की सही पहचान के लिए कम से कम एक भूमिका मिलनी चाहिए, जो DB से 'स्थानीय होस्ट अपवाद' (यह mongoDB के ऑन-प्रिमाइसेस के लिए है) से बचना होगा, हालांकि आपके पास सब कुछ है और अभी भी है लगभग हर कमांड पर अधिकृत अपवाद नहीं मिल रहा है, जबकि मोंगोडीबी का उपयोग करते हुए जो मोंगो एटलस का उपयोग करके बनाया गया है , तो यहां वह स्थान है जहां आप कारण जान सकते हैं, क्यों:

/dba/219003/not-authorized-on-admin-to-execute-command-mongodb-atlas-m0-free-tier-cluster?newreg=471a9a26108243d78d4ca74a87e7a115

और यह भी जांच लें कि क्या आपने मोंगो एटलस पर मोंगोडीबी होस्ट किया है :

https://docs.atlas.mongodb.com/unsupported-commands/


0
Use Admin :
    use admin

Create a super user : 

    db.createUser(
    {
    user: "master",
    pwd: "test@123",
    roles: [ 
    { 
    role: "readWriteAnyDatabase", 
    db: "admin" 
    }, 
    {
    "role" : "dbAdminAnyDatabase",
    "db" : "admin"
    },
    {
    "role" : "clusterAdmin",
    "db" : "admin"
    },
    "userAdminAnyDatabase" 
    ]
    }
    )

1
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित अल्पकालिक सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखाते हुए इसके दीर्घकालिक मूल्य में बहुत सुधार करेगा , और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया अपने स्पष्टीकरण को संपादित करने के लिए कुछ स्पष्टीकरण जोड़ने के लिए, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
टोबे स्पाइट

0

मैंने MongoDB 4.2 के लिए सेंटोस 7 पर इन चरणों का पालन किया। (दूरस्थ उपयोगकर्ता)

अद्यतन mongod.conf फ़ाइल

vi /etc/mongod.conf
   net:
     port: 27017
     bindIp: 0.0.0.0 
   security:
     authorization: enabled

MongoDB सेवा दानव प्रारंभ करें

systemctl start mongod

MongoDB खोल खोलें

mongo

इस आदेश को शेल पर निष्पादित करें

use admin
db.createUser(
  {
    user: 'admin',
    pwd: 'YouPassforUser',
    roles: [ { role: 'root', db: 'admin' } ]
  }
);

रिमोट रूट उपयोगकर्ता बनाया गया है। अब आप अपने देव मशीन से किसी भी MongoDB जीयूआई उपकरण का उपयोग करके इस डेटाबेस कनेक्शन का परीक्षण कर सकते हैं। जैसे रोबो 3 टी


-10

ऐसा इसलिए हो सकता है क्योंकि आपने mongodb.conf में noAuth = true सेट किया है

# Turn on/off security.  Off is currently the default
noauth = true
#auth = true

इस सेटिंग को सेट करने के बाद सेवा को पुनः आरंभ करें

सर्विस मेनोड रिस्टार्ट


1
उपयोगकर्ता स्पष्ट रूप से कहता है कि वह प्राधिकरण का उपयोग करना शुरू करना चाहता है, इस प्रकार उसने अथॉरिटी = सच को अनलॉक्ड किया है। आप प्राधिकरण को अक्षम करने का सुझाव क्यों देते हैं?
एलेक्स 75

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