ไม่สามารถรับรองความถูกต้องเป็น mongo ได้“ auth failed”


93

ฉันได้สร้างผู้ดูแลระบบสำหรับ mongo โดยใช้คำแนะนำเหล่านี้:

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

จากไคลเอนต์ mongo ดูเหมือนว่าฉันสามารถรับรองความถูกต้อง:

> use admin
switched to db admin
> db.auth('admin','SECRETPASSWORD');
1
>

แต่ฉันไม่สามารถเชื่อมต่อทางอื่นได้ ตัวอย่างเช่น:

mongo -u admin -p SECRETPASSWORD

ให้ข้อผิดพลาด:

JavaScript execution failed: Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" } at src/mongo/shell/db.js:L228

ฉันมีauth = trueในetc/mongod.conf.

ฉันขาดอะไรไป?


1
บางที Mongo ถูกกำหนดค่าให้ยอมรับการเชื่อมต่อจาก localhost เท่านั้น? อย่างน้อยก็เกิดขึ้นกับฉันโดยใช้อินสแตนซ์ mongodb การผลิตของเราเมื่อพยายามเข้าถึงจากคอมพิวเตอร์ของฉัน
Akku

ฉันไม่คิดอย่างนั้นฉันได้รับข้อความแสดงข้อผิดพลาดเมื่อเชื่อมต่อจากเครื่องเดียวกันกับ mongod นอกจากนี้ยังช่วยให้ฉันเชื่อมต่อได้โดยไม่ต้องระบุชื่อผู้ใช้ / รหัสผ่านจากนั้นให้ชื่อผู้ใช้ / รหัสผ่านด้วย db.auth (ตัวอย่างแรกของฉัน)
justkevin

PS: db.changeUserPassword("admin", "password")เพื่อเปลี่ยนรหัสผ่านสำหรับแต่ละฐานข้อมูล
laggingreflex

อาจช่วยได้stackoverflow.com/questions/47253584/…
DaveIdito

คำตอบ:


106

การรับรองความถูกต้องได้รับการจัดการในระดับฐานข้อมูล เมื่อคุณพยายามที่จะเชื่อมต่อกับระบบการใช้ฐานข้อมูล Mongo <database>.system.usersจริงการตรวจสอบข้อมูลประจำตัวที่คุณให้อยู่ในคอลเลกชัน ดังนั้นโดยพื้นฐานแล้วเมื่อคุณพยายามเชื่อมต่อกับ "ทดสอบ" ระบบจะค้นหาข้อมูลรับรองในtest.system.usersและส่งกลับข้อผิดพลาดเนื่องจากไม่พบข้อมูลดังกล่าว (เนื่องจากถูกเก็บไว้ในadmin.system.users) การมีสิทธิ์ในการอ่านและเขียนจากฐานข้อมูลทั้งหมดไม่ได้หมายความว่าคุณสามารถเชื่อมต่อกับฐานข้อมูลเหล่านี้ได้โดยตรง

คุณต้องเชื่อมต่อกับฐานข้อมูลที่มีข้อมูลประจำตัวก่อน ลอง:

mongo admin -u admin -p SECRETPASSWORD

ดูข้อมูลเพิ่มเติมได้ที่http://docs.mongodb.org/manual/reference/privilege-documents/


5
ตามที่ระบุไว้ด้านล่างในคำตอบอื่น (แต่ฉันพลาดเพราะฉันดูเฉพาะคนที่ได้รับการโหวตสูงสุด) ฉันต้องใส่เครื่องหมายคำพูดเดียวรอบ ๆ ชื่อผู้ใช้และรหัสผ่านก่อนที่ฉันจะสามารถเข้าสู่ระบบได้
gsaslis

1
ใช่ถ้าคุณใช้เครื่องหมายคำพูดคู่การทุบตีงี่เง่าอาจทำสิ่งที่น่ารังเกียจได้ทุกประเภท
moodboom

74

ฉันยังได้รับข้อผิดพลาดนี้สิ่งที่ฉันต้องการคือระบุฐานข้อมูลที่จัดเก็บข้อมูลการตรวจสอบผู้ใช้:

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

อัปเดต 18 พ.ย. 2560:

mongo admin -u admin -p

เป็นทางออกที่ดีกว่า Mongo จะแจ้งให้คุณใส่รหัสผ่านด้วยวิธีนี้คุณจะไม่ใส่รหัสผ่านเคลียร์เท็กซ์ของคุณลงในประวัติเชลล์ซึ่งเป็นวิธีปฏิบัติด้านความปลอดภัยที่แย่มาก


2
ใช่คำตอบนี้ใช้ได้! เมื่อรวมสิ่งนี้เข้ากับคำตอบจาก @gilo คำสั่งต่อไปนี้ใช้ได้กับฉัน: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo

38

คุณอาจต้องอัพเกรดเปลือก Mongo ของคุณ ฉันมีเวอร์ชัน 2.4.9 ของ mongo shell ในเครื่องและฉันได้รับข้อผิดพลาดนี้ขณะพยายามเชื่อมต่อกับฐานข้อมูล mongo 3 การอัปเกรดเวอร์ชันเชลล์เป็น 3 ช่วยแก้ปัญหาได้


7
ตามที่ระบุไว้ในเอกสาร: เวอร์ชันของ mongo shell ก่อน 3.0 เข้ากันไม่ได้กับการปรับใช้ MongoDB 3.0 ที่บังคับใช้การควบคุมการเข้าถึง หากคุณมีการปรับใช้ 3.0 MongoDB ที่ต้องการการควบคุมการเข้าถึงคุณต้องใช้ mongo shell เวอร์ชัน 3.0
Finch_Powers

33

ฉันรู้ว่าสิ่งนี้อาจดูเหมือนชัดเจน แต่ฉันก็ต้องใช้เครื่องหมายคำพูดเดียวรอบ ๆ u / n และ p / w ก่อนที่จะใช้งานได้

mongo admin -u 'ผู้ใช้' -p 'รหัสผ่าน'


2
ฉันสะดุดกับคำตอบของคุณเพราะmongo -u <myuser> -p <mypasswdไม่ได้ผล ทำไมถึงadminสร้างความแตกต่างที่นี่?
blz

2
มันบอกให้ Mongo ใช้ฐานข้อมูล admin หากคุณสร้างฐานข้อมูลอื่นและกำหนดผู้ใช้ให้กับฐานข้อมูลนั้นจะเป็น mongo <another_database> -u user -p password
Afriyandi Setiawan

ขอบคุณมาก. นี่เป็นเรื่องแปลกจริงๆที่ฉันไม่ใช้เครื่องหมายคำพูดและเครื่องหมายคำพูดคู่มันใช้งานไม่ได้ มันโง่มาก
สนิม

20

ใน MongoDB 3.0 ตอนนี้รองรับกลไกการตรวจสอบสิทธิ์หลายแบบ

  1. MongoDB Challenge and Response (SCRAM-SHA-1) - ค่าเริ่มต้นใน 3.0
  2. MongoDB Challenge and Response (MONGODB-CR) - ค่าเริ่มต้นก่อนหน้า (<3.0)

หากคุณเริ่มต้นด้วยฐานข้อมูล 3.0 ใหม่โดยมีผู้ใช้ใหม่สร้างขึ้นระบบจะสร้างโดยใช้ SCRAM-SHA-1

ดังนั้นคุณจะต้องมีไดรเวอร์ที่สามารถตรวจสอบความถูกต้องได้:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#considerations-scram-sha-1-drivers

หากคุณอัปเกรดฐานข้อมูลจาก 2.x ด้วยข้อมูลผู้ใช้ที่มีอยู่ฐานข้อมูลเหล่านี้จะยังคงใช้ MONGODB-CR และฐานข้อมูลการตรวจสอบผู้ใช้จะต้องได้รับการอัปเกรด:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#upgrade-mongodb-cr-to-scram

ตอนนี้การเชื่อมต่อกับ MongoDB 3.0 กับผู้ใช้ที่สร้างด้วย SCRAM-SHA-1 จำเป็นต้องระบุฐานข้อมูลการตรวจสอบความถูกต้อง (ผ่านทางไคลเอนต์ mongo บรรทัดคำสั่ง) และใช้กลไกอื่น ๆ หากใช้ไดรเวอร์

$> mongo -u USER -p PASSWORD --authenticationDatabase admin

ในกรณีนี้ฐานข้อมูล "admin" ซึ่งเป็นค่าเริ่มต้นจะถูกใช้เพื่อตรวจสอบสิทธิ์


การเปลี่ยนแปลงพฤติกรรมนี้มีความสำคัญเนื่องจากทำให้ฉันสะดุดเมื่อผสม MongoDB เวอร์ชันใหม่และ pymongo เวอร์ชันเก่า คุณต้องตรวจสอบให้แน่ใจว่าอินสแตนซ์ mongo ของคุณและไคลเอนต์ Mongo ทั้งหมดเป็นข้อมูลล่าสุด
i_grok

นี่เป็นกรณีของฉัน: 1. เปลี่ยน mongo-java-driver-2.12.3.jar เป็น mongo-java-driver-3.2.2.jar 2. เปลี่ยน MongoCredential.createMongoCRCredential เป็น MongoCredential.createCredential
nikolai.serdiuk

ฮึ. ว่ามันยากที่จะเป็นสำหรับนักพัฒนาที่จะทำให้เรามีข้อผิดพลาดที่ดีขึ้นเช่น "วิธีการตรวจสอบไม่ถูกต้อง"
ไบรอนวิทล็อค

15

สิ่งนี้แก้ไขปัญหาของฉัน:

mongoไปที่เปลือกขั้วและประเภท

use db_nameประเภทแล้ว

จากนั้นพิมพ์:

 db.createUser(
   {
     user: "mongodb",
     pwd: "dogmeatsubparflavour1337",
     roles: [ { role: "dbOwner", db: "db_name" } ]
   }
 )

ลองดู: db.getUsers()

ตัวอย่างด่วน:

const MongoClient = require('mongodb').MongoClient;

// MongoDB Connection Info
const url = 'mongodb://mongodb:dogmeatsubparflavour1337@stackoverflow.com:27017/?authMechanism=DEFAULT&authSource=db_name';
// Additional options: https://docs.mongodb.com/manual/reference/connection-string/#connection-string-options

// Use Connect Method to connect to the Server
MongoClient.connect(url)
  .then((db) => {
    console.log(db);
    console.log('Casually connected correctly to server.');
    // Be careful with db.close() when working asynchronously
    db.close();
  })
  .catch((error) => {
    console.log(error);
  });

2
วิธีเพิ่ม: 1. เข้าสู่ระบบฐานข้อมูลผู้ดูแลระบบด้วย mongodb superadmin ก่อน: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. จากนั้นเปลี่ยนเป็นฐานข้อมูลเป้าหมาย: > use targetDb 3. จากนั้นเพิ่มผู้ใช้> db.createUser(...)
daniel.widyanto

13

มันจะปรากฏเป็นปัญหาที่ผู้ใช้สร้างขึ้นผ่านทางวิธีการอธิบายในเอกสาร Mongo ไม่ได้รับอนุญาตให้เชื่อมต่อกับฐานข้อมูลเริ่มต้น (ทดสอบ) แม้ว่าผู้ใช้ที่ถูกสร้างขึ้นด้วย "userAdminAnyDatabase" และ "dbAdminAnyDatabase" บทบาท


มีปัญหาเดียวกัน พวกเขาอาจเป็นวิธีใช้ฐานข้อมูลผู้ดูแลระบบเป็นค่าเริ่มต้นแทนการทดสอบ
Idan Shechter

3

ความเป็นไปได้อื่น ๆ : เมื่อคุณสร้างผู้ใช้คุณอาจได้รับuseฐานข้อมูลอื่นที่ไม่ใช่adminหรือฐานข้อมูลอื่นที่คุณต้องการโดยบังเอิญ คุณต้องตั้งค่า--authenticationDatabaseเป็นฐานข้อมูลที่ผู้ใช้สร้างขึ้นจริง

mongodbดูเหมือนว่าจะทำให้คุณอยู่ในtestฐานข้อมูลโดยค่าเริ่มต้นเมื่อคุณเปิดเปลือกดังนั้นคุณจะต้องเขียน--authenticationDatabase testมากกว่า--authenticationDatabase adminถ้าคุณตั้งใจถูกuseไอเอ็นจีเมื่อคุณวิ่งtestdb.createUser(...)

สมมติว่าคุณสามารถเข้าถึงเครื่องที่เรียกใช้อินสแตนซ์ mongodb ได้ y สามารถปิดใช้งานการอนุญาตใน/etc/mongod.conf(แสดงความคิดเห็นauthorizationซึ่งซ้อนอยู่ภายใต้การรักษาความปลอดภัย) จากนั้นรีสตาร์ทเซิร์ฟเวอร์ของคุณจากนั้นเรียกใช้:

mongo
show users

และคุณอาจได้รับสิ่งนี้:

{
    "_id" : "test.myusername",
    "user" : "myusername",
    "db" : "test",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "mydatabasename"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

สังเกตว่าค่าเท่ากับdb testนั่นเป็นเพราะเมื่อฉันสร้างผู้ใช้ที่ฉันไม่ได้ทำงานเป็นครั้งแรกหรือuse admin use desiredDatabaseNameดังนั้นคุณสามารถลบผู้ใช้ด้วยdb.dropUser("myusername")และสร้างผู้ใช้อื่นภายใต้ฐานข้อมูลที่คุณต้องการดังนี้:

use desiredDatabaseName
db.createUser(...)

หวังว่าจะช่วยคนที่อยู่ในฐานะ noob ของฉันด้วยสิ่งนี้


2

นี่เป็นกรณีเฉพาะ แต่ในกรณีที่มีใครมาที่นี่พร้อมกับปัญหาของฉัน:

ใน MongoHQ จะแสดงฟิลด์ที่เรียกว่า "รหัสผ่าน" แต่จริงๆแล้วมันเป็นเพียงแฮชของรหัสผ่านเท่านั้น คุณจะต้องเพิ่มผู้ใช้ใหม่และเก็บรหัสผ่านไว้ที่อื่น (เนื่องจาก MongoHQ จะไม่แสดงให้คุณเห็น)


2

วิธีที่เหมาะสมในการล็อกอินเข้าสู่ mongo shell คือ

mongo localhost: 27017 -u 'uuuuu' -p '> xxxxxx' --authenticationDatabase ฐานข้อมูล


1

คุณสามารถลองสิ่งนี้: -

mongo localhost:27017/admin -u admin -p SECRETPASSWORD

พบได้ในโพสต์นี้

ที่นี่เห็นได้ชัดว่าlocalhostสามารถเป็นโฮสต์อื่นได้และ/ adminอาจเป็นฐานข้อมูลอื่นที่ใช้การตรวจสอบสิทธิ์


0

ตรวจสอบเวอร์ชัน mongo ของไคลเอนต์ที่เรากำลังเชื่อมต่อกับเซิร์ฟเวอร์ mongo

กรณีของฉันเซิร์ฟเวอร์ mongo เป็นเวอร์ชัน Mongo4.0.0 แต่ไคลเอนต์ของฉันเป็นเวอร์ชัน 2.4.9 อัปเดตเวอร์ชัน mongo เพื่ออัปเดต mongo cli

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.