Tidak dapat mengautentikasi menjadi mongo, "auth gagal"


91

Saya telah membuat pengguna admin untuk mongo menggunakan petunjuk ini:

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

Dari klien mongo sepertinya saya dapat mengotentikasi:

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

Tapi saya tidak bisa terhubung dengan cara lain. Sebagai contoh:

mongo -u admin -p SECRETPASSWORD

memberikan kesalahan:

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

Saya sudah auth = truemasuk etc/mongod.conf.

Apa yang saya lewatkan?


1
Mungkin Mongo dikonfigurasi untuk hanya menerima koneksi dari localhost? Itu setidaknya terjadi pada saya menggunakan contoh mongodb produksi kami ketika mencoba mengaksesnya dari komputer saya.
Akku

Saya rasa tidak, saya mendapatkan pesan kesalahan itu saat menghubungkan dari mesin yang sama dengan mongod. Selain itu, ini memungkinkan saya terhubung tanpa memberikan nama pengguna / kata sandi dan kemudian memberikan nama pengguna / kata sandi dengan db.auth (contoh pertama saya).
justkevin

PS: db.changeUserPassword("admin", "password")untuk mengubah kata sandi untuk setiap database.
laggingreflex

Jawaban:


105

Otentikasi dikelola di tingkat database. Ketika Anda mencoba untuk menyambung ke sistem menggunakan database, mongo sebenarnya memeriksa kredensial yang Anda berikan dalam koleksi <database>.system.users. Jadi, pada dasarnya saat Anda mencoba untuk menyambung ke "test", itu mencari kredensial test.system.usersdan mengembalikan kesalahan karena tidak dapat menemukannya (karena disimpan admin.system.users). Memiliki hak untuk membaca dan menulis dari semua db tidak berarti Anda dapat langsung terhubung ke mereka.

Anda harus terhubung ke database yang memegang kredensial terlebih dahulu. Mencoba:

mongo admin -u admin -p SECRETPASSWORD

Untuk info lebih lanjut, periksa http://docs.mongodb.org/manual/reference/privilege-documents/


4
seperti yang juga disebutkan di bawah ini, di jawaban lain (tapi saya melewatkannya, karena saya hanya melihat yang paling banyak dipilih) saya perlu menambahkan tanda kutip tunggal di sekitar nama pengguna dan kata sandi, sebelum saya bisa masuk
gsaslis

Ya, jika Anda menggunakan tanda kutip ganda, pesta bodoh mungkin akan melakukan segala macam hal yang tidak menyenangkan.
moodboom

73

Saya juga menerima kesalahan ini, yang saya butuhkan adalah menentukan database tempat data otentikasi pengguna disimpan:

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

Perbarui 18 November 2017:

mongo admin -u admin -p

adalah solusi yang lebih baik. Mongo akan meminta kata sandi Anda, dengan cara ini Anda tidak akan memasukkan kata sandi cleartext Anda ke dalam riwayat shell yang hanya merupakan praktik keamanan yang buruk.


2
Ya, jawaban ini berhasil! Menggabungkan ini dengan jawaban dari @gilo, perintah berikut berfungsi untuk saya: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo

38

Anda mungkin perlu mengupgrade shell mongo Anda. Saya memiliki versi 2.4.9 dari mongo shell secara lokal, dan saya mendapatkan kesalahan ini saat mencoba menyambung ke database mongo 3. Mengupgrade versi shell ke 3 menyelesaikan masalah.


7
Seperti yang dinyatakan dalam dokumen: Versi mongo shell sebelum 3.0 tidak kompatibel dengan penyebaran 3.0 MongoDB yang memberlakukan kontrol akses. Jika Anda memiliki penerapan 3.0 MongoDB yang memerlukan kontrol akses, Anda harus menggunakan versi 3.0 dari mongo shell.
Finch_Powers

33

Saya tahu ini mungkin tampak jelas tetapi saya juga harus menggunakan satu kutipan di sekitar u / n dan p / w sebelum berhasil

mongo admin -u 'user' -p 'password'


2
Saya tersandung pada jawaban Anda karena mongo -u <myuser> -p <mypasswdtidak berfungsi. Mengapa adminmembuat perbedaan di sini?
blz

2
itu memberitahu mongo untuk menggunakan admin database. jika Anda membuat database lain, dan menetapkan pengguna ke database tersebut, maka database tersebut akan menjadi mongo <another_database> -u user -p password
Afriyandi Setiawan

Terima kasih banyak. Ini benar-benar aneh saya tidak menggunakan tanda kutip dan tanda kutip ganda tidak berfungsi. Itu sangat konyol.
berkarat

20

Di MongoDB 3.0, sekarang mendukung beberapa mekanisme otentikasi.

  1. Tantangan dan Respons MongoDB (SCRAM-SHA-1) - default di 3.0
  2. Tantangan dan Respons MongoDB (MONGODB-CR) - default sebelumnya (<3.0)

Jika Anda memulai dengan database 3.0 baru dengan pengguna baru yang dibuat, mereka akan dibuat menggunakan SCRAM-SHA-1.

Jadi Anda membutuhkan driver yang mampu melakukan otentikasi itu:

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

Jika Anda memiliki basis data yang ditingkatkan dari 2.x dengan data pengguna yang ada, mereka masih akan menggunakan MONGODB-CR, dan basis data otentikasi pengguna harus ditingkatkan:

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

Sekarang, menghubungkan ke MongoDB 3.0 dengan pengguna yang dibuat dengan SCRAM-SHA-1 diperlukan untuk menentukan basis data otentikasi (melalui baris perintah mongo klien), dan menggunakan mekanisme lain jika menggunakan driver.

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

Dalam hal ini, database "admin", yang juga merupakan default akan digunakan untuk otentikasi.


Perubahan perilaku ini penting, karena membuat saya tersandung saat mencampur versi baru MongoDB dan versi lama pymongo. Anda perlu memastikan instans mongo Anda dan semua klien mongo sudah diperbarui.
i_grok

Ini adalah kasus saya: 1. Mengubah mongo-java-driver-2.12.3.jar menjadi mongo-java-driver-3.2.2.jar 2. Mengubah MongoCredential.createMongoCRCredential menjadi MongoCredential.createCredential
nikolai.serdiuk

ugh. betapa sulitnya bagi pengembang untuk memberi kami kesalahan yang lebih baik seperti "metode otentikasi tidak valid"
Byron Whitlock

15

Ini memperbaiki masalah saya:

Pergi ke shell terminal dan ketik mongo.

Lalu ketik use db_name.

Kemudian ketik:

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

Juga coba: db.getUsers()

Sampel cepat:

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
Untuk menambahkan: 1. Login ke database admin dengan mongodb superadmin terlebih dahulu: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. Kemudian beralih ke database target: > use targetDb 3. Kemudian tambahkan pengguna> db.createUser(...)
daniel.widyanto

13

Ini muncul masalahnya adalah bahwa pengguna dibuat melalui metode yang dijelaskan dalam dokumen mongo tidak memiliki izin untuk menghubungkan ke database default (test), bahkan jika pengguna diciptakan dengan "userAdminAnyDatabase" dan peran "dbAdminAnyDatabase".


memiliki masalah yang sama. Mereka mungkin cara untuk menggunakan db admin sebagai default daripada tes
Idan Shechter

3

Kemungkinan lain: Saat Anda membuat pengguna, Anda mungkin secara tidak sengaja telah usemembuat database selain admin, atau selain yang Anda inginkan. Anda perlu menyetel --authenticationDatabaseke database tempat pengguna sebenarnya dibuat.

mongodbtampaknya menempatkan Anda dalam testdatabase dengan default ketika Anda membuka shell, sehingga Anda akan perlu untuk menulis --authenticationDatabase testdaripada --authenticationDatabase adminjika Anda secara tidak sengaja yang useing testketika Anda berlari db.createUser(...).

Dengan asumsi Anda memiliki akses ke mesin yang menjalankan instance mongodb, y dapat menonaktifkan otorisasi di /etc/mongod.conf(komentar keluar authorizationyang bersarang di bawah keamanan), lalu mulai ulang server Anda, lalu jalankan:

mongo
show users

Dan Anda mungkin mendapatkan sesuatu seperti ini:

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

Perhatikan bahwa dbnilainya sama test. Itu karena saat saya membuat pengguna, saya tidak menjalankan use adminatau use desiredDatabaseName. Jadi Anda dapat menghapus pengguna dengan db.dropUser("myusername")dan kemudian membuat pengguna lain di bawah database yang Anda inginkan seperti:

use desiredDatabaseName
db.createUser(...)

Mudah-mudahan itu membantu seseorang yang pernah berada di posisi saya sebagai noob dengan hal ini.


2

Ini adalah jenis kasus khusus, tetapi jika ada yang sampai di sini dengan masalah saya:

Di MongoHQ, ini akan menunjukkan kepada Anda bidang yang disebut "kata sandi", tetapi sebenarnya itu hanya hash kata sandi. Anda harus menambahkan pengguna baru dan menyimpan kata sandi di tempat lain (karena MongoHQ tidak akan menunjukkannya kepada Anda).


2

Cara yang tepat untuk login ke mongo shell adalah

mongo localhost: 27017 -u 'uuuuu' -p '> xxxxxx' --authenticationDatabase dbname


1

Anda juga dapat mencoba ini: -

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

Temukan di posting ini

Di sini jelas localhost bisa menjadi beberapa host lain dan / admin bisa menjadi database lain di mana otentikasi telah diterapkan


0

Periksa versi mongo klien dari tempat kami terhubung ke server mongo.

Kasus saya, server mongo adalah versi Mongo4.0.0 tetapi klien saya menggunakan versi 2.4.9. Perbarui versi mongo untuk memperbarui mongo cli.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.