Mongo'da kimlik doğrulaması yapılamıyor, "kimlik doğrulama başarısız"


91

Şu talimatları kullanarak mongo için bir yönetici kullanıcı oluşturdum:

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

Mongo istemcisinden kimlik doğrulaması yapabiliyorum gibi görünüyor:

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

Ama başka türlü bağlantı kuramıyorum. Örneğin:

mongo -u yönetici -p SECRETPASSWORD

şu hatayı verir:

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

Ben auth = truede etc/mongod.conf.

Neyi kaçırıyorum?


1
Mongo belki de yalnızca localhost'tan gelen bağlantıları kabul edecek şekilde yapılandırılmıştır? Bu, en azından bilgisayarımdan ona erişmeye çalışırken üretim mongodb örneğimizi kullandığım zaman oldu.
Akku

Sanmıyorum, mongod ile aynı makineden bağlanırken bu hata mesajını alıyorum. Ayrıca, bir kullanıcı adı / parola sağlamadan ve ardından db.auth ile bir kullanıcı adı / parola sağlamadan bağlanmama izin veriyor (ilk örneğim).
justkevin

Not: db.changeUserPassword("admin", "password")her veritabanı için parolayı değiştirmek için.
gecikme refleksi

Yanıtlar:


105

Kimlik doğrulama, bir veritabanı düzeyinde yönetilir. Sisteme bir veritabanı kullanarak bağlanmaya çalıştığınızda, mongo aslında koleksiyonda sağladığınız kimlik bilgilerini kontrol eder <database>.system.users. Dolayısıyla, temelde "test" e bağlanmaya çalıştığınızda, içinde kimlik bilgilerini arar test.system.usersve bulamadığı için (içinde depolandıkları gibi admin.system.users) bir hata döndürür . Tüm veritabanlarından okuma ve yazma hakkına sahip olmak, onlara doğrudan bağlanabileceğiniz anlamına gelmez.

Önce kimlik bilgilerini tutan veritabanına bağlanmanız gerekir. Deneyin:

mongo admin -u admin -p SECRETPASSWORD

Daha fazla bilgi için bu http://docs.mongodb.org/manual/reference/privilege-documents/ adresini kontrol edin.


4
aşağıda da belirtildiği gibi, başka bir cevapta (ama sadece en çok
oylananlara baktığım için kaçırdım)

Evet, çift tırnak kullanırsanız, aptalca bash muhtemelen her türlü kötü şeyi yapacaktır.
moodboom

74

Bu hatayı da aldım, ihtiyacım olan şey kullanıcı kimlik doğrulama verilerinin depolandığı veritabanını belirtmekti:

mongo -u yönetici -p SECRETPASSWORD --authenticationDatabase yöneticisi

18 Kasım 2017 Güncellemesi:

mongo admin -u admin -p

daha iyi bir çözüm. Mongo sizden şifrenizi isteyecektir, bu şekilde açık metin şifrenizi kabuk geçmişine koymayacaksınız, bu sadece korkunç bir güvenlik uygulamasıdır.


2
Evet, bu cevap işe yarıyor! Bunu @gilo'dan gelen yanıtla birleştirdiğimde, aşağıdaki komut benim için çalışıyor: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo

38

Mongo kabuğunuzu yükseltmeniz gerekebilir. Yerel olarak mongo kabuğunun 2.4.9 sürümüne sahiptim ve bu hatayı bir mongo 3 veritabanına bağlanmaya çalışırken aldım. Kabuk sürümünü 3'e yükseltmek sorunu çözdü.


7
Belgede belirtildiği gibi: mongo kabuğunun 3.0'dan önceki sürümleri, erişim denetimini zorlayan MongoDB'nin 3.0 dağıtımlarıyla uyumlu değildir. Erişim denetimi gerektiren bir 3.0 MongoDB dağıtımınız varsa, mongo kabuğunun 3.0 sürümlerini kullanmanız gerekir.
Finch_Powers

33

Bunun açık görünebileceğini biliyorum, ancak işe yaramadan önce u / n ve p / w etrafında tek bir alıntı kullanmak zorunda kaldım

mongo admin -u 'kullanıcı' -p 'şifre'


2
Cevabınızı tökezledim çünkü mongo -u <myuser> -p <mypasswdişe yaramadı. Neden adminburada bir fark yaratır?
blz

2
mongo'ya veritabanı yöneticisini kullanmasını söyler. Başka bir veritabanı oluşturur ve kullanıcıyı bu veritabanına
atarsanız

Çok teşekkür ederim. Bu gerçekten tuhaf, hiçbir tırnak ve çift tırnak kullanmam işe yaramıyordu. Bu çok aptalca.
paslı

20

MongoDB 3.0'da artık çoklu kimlik doğrulama mekanizmalarını destekliyor.

  1. MongoDB Sınaması ve Yanıtı (SCRAM-SHA-1) - 3.0'da varsayılan
  2. MongoDB Sınaması ve Yanıtı (MONGODB-CR) - önceki varsayılan (<3.0)

Oluşturulan yeni kullanıcılarla yeni bir 3.0 veritabanıyla başladıysanız, bunlar SCRAM-SHA-1 kullanılarak oluşturulmuş olacaktı.

Bu nedenle, bu kimlik doğrulamasını yapabilen bir sürücüye ihtiyacınız olacak:

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

Mevcut kullanıcı verileriyle 2.x'ten yükseltilmiş bir veritabanınız olsaydı, bunlar hala MONGODB-CR kullanıyor olacak ve kullanıcı kimlik doğrulama veritabanının yükseltilmesi gerekecekti:

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

Artık, kimlik doğrulama veritabanını (komut satırı mongo istemcisi aracılığıyla) belirtmek ve bir sürücü kullanılıyorsa diğer mekanizmaları kullanmak için SCRAM-SHA-1 ile oluşturulmuş kullanıcılarla MongoDB 3.0'a bağlanmak gerekiyor.

$> mongo -u KULLANICI -p ŞİFRE --authenticationDatabase yöneticisi

Bu durumda, aynı zamanda varsayılan olan "admin" veritabanı kimlik doğrulaması için kullanılacaktır.


Bu davranış değişikliği, MongoDB'nin yeni bir sürümü ile pymongo'nun eski bir sürümünü karıştırırken beni heyecanlandırdığı için önemli. Mongo örneğinizin ve tüm mongo istemcilerinizin güncel olduğundan emin olmanız gerekir.
i_grok

Benim durumum buydu: 1. mongo-java-driver-2.12.3.jar, mongo-java-driver-3.2.2.jar olarak değiştirildi 2. MongoCredential.createMongoCRCredential, MongoCredential.createCredential olarak değiştirildi
nikolai.serdiuk

ugh. geliştiricilerin bize "geçersiz kimlik doğrulama yöntemi" gibi daha iyi bir hata vermesi ne kadar zor olurdu
Byron Whitlock

15

Bu sorunumu çözdü:

Terminal kabuğuna gidin ve yazın mongo.

Ardından yazın use db_name.

Ardından şunu yazın:

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

Ayrıca denemek: db.getUsers()

Hızlı örnek:

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
Eklemek için: 1. Önce mongodb süper yönetici ile yönetici veritabanına giriş yapın: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. Ardından hedef veritabanına geçin: > use targetDb 3. Ardından kullanıcıyı ekleyin> db.createUser(...)
daniel.widyanto

13

Görünen sorun Mongo docs tanımlanan metot yoluyla oluşturulan bir kullanıcı bu kullanıcı "userAdminAnyDatabase" ve "dbAdminAnyDatabase" rolleri ile oluşturulmuş olsa bile, varsayılan veritabanı (test) bağlanmak için izni yok olmasıdır.


aynı sorun var. Test yerine varsayılan olarak admin db'yi kullanmanın bir yolu olabilir
Idan Shechter

3

Başka bir olasılık: Kullanıcıyı oluşturduğunuzda, yanlışlıkla istediğiniz useveritabanı dışında adminveya başka bir veritabanını kullanıyor olabilirsiniz . --authenticationDatabaseKullanıcının gerçekte altında oluşturulduğu veritabanını ayarlamanız gerekir .

mongodbkoymak gibi görünüyor testEğer kabuk açtığınızda iletişim kurmanız gerekir, böylece varsayılan olarak veritabanında --authenticationDatabase testyerine --authenticationDatabase adminyanlışlıkla olsaydı useing testkaçtın zaman db.createUser(...).

Mongodb örneğini çalıştıran makineye erişiminiz olduğunu varsayarsak, yetkilendirmeyi devre dışı bırakabilir /etc/mongod.conf( authorizationgüvenlik altında iç içe geçmiş olan açıklama ) ve ardından sunucunuzu yeniden başlatabilir ve ardından şunu çalıştırabilirsiniz:

mongo
show users

Ve bunun gibi bir şey elde edebilirsiniz:

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

dbDeğerin eşit olduğuna dikkat edin test. Bunun nedeni, kullanıcıyı oluşturduğumda ilk önce use adminya da use desiredDatabaseName. Böylece kullanıcıyı silebilir db.dropUser("myusername")ve ardından aşağıdaki gibi istediğiniz veri tabanı altında başka bir kullanıcı oluşturabilirsiniz:

use desiredDatabaseName
db.createUser(...)

Umarım bu, bu tür şeylerde çaylak olarak konumumda olan birine yardımcı olur.


2

Bu biraz özel bir durum, ama benim sorunumla buraya birinin gelmesi durumunda:

MongoHQ'da size "şifre" adlı bir alan gösterecek, ancak bu aslında şifrenin karmasıdır. Yeni bir kullanıcı eklemeniz ve parolayı başka bir yerde saklamanız gerekir (çünkü MongoHQ bunu size göstermez).


2

Mongo kabuğuna giriş yapmanın doğru yolu

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


1

Ayrıca şunu da deneyebilirsiniz: -

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

Buldum bu yazı

Açıkçası, yerel ana bilgisayar başka bir ana bilgisayar olabilir ve / admin , kimlik doğrulamanın uygulandığı başka bir veritabanı olabilir


0

Mongo sunucusuna bağlandığımız istemcinin mongo sürümünü kontrol edin.

Benim durumum, mongo sunucusu Mongo4.0.0 sürümündeydi ama istemcim 2.4.9 sürümündeydi. Mongo cli'yi güncellemek için mongo sürümünü güncelleyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.