MongoDB - yönetici kullanıcı yetkilendirilmedi


200

MongoDB'ime yetki eklemeye çalışıyorum.
Bütün bunları MongoDB 2.6.1 ile Linux'ta yapıyorum.
Mongod.conf dosyam eski uyumluluk biçimindedir
(yükleme ile birlikte bu şekilde gelir).

1) Burada (3) 'de açıklandığı gibi yönetici kullanıcı oluşturdum

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

2) Daha sonra bu satırı açarak mongod.conf dosyasını düzenledim

auth = true

3) Sonunda mongod servisini yeniden başlattım ve giriş yapmaya çalıştım:

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

4) Bağlanabiliyorum ama bağlandığında bunu söylüyor.

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) Şimdi saoluşturduğum bu kullanıcının hiçbir izni yok gibi görünüyor .

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 >>>

Sorun nedir? Tüm bu prosedürü 3 kez tekrarladım ve
sanırım hepsini MongoDB belgelerinde belirtildiği gibi yaptım. Ama işe yaramıyor.
Bu sakullanıcının
, daha sonra başka kullanıcılar oluşturabilmesi ve onlara daha spesifik izinler verebilmesi için her şeyi yapmaya yetkili olmasını bekliyordum .


20
Bu çok can sıkıcı veya kötü bir şekilde belgelenmiş. Orada kendimle mücadele ediyordum. Sonunda, küresel "kök" rolü olan bir kullanıcı var ve hala komutları yürütmek gibi bazı şeyler
yapamıyorum

Yanıtlar:


476

Ben de aynı sorun etrafında başımı kaşıyordu ve ilk yönetici kullanıcı eklerken rolü kök olarak ayarladıktan sonra her şey çalıştı.

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

adminKullanıcıyı daha önce oluşturduysanız , rolü şu şekilde değiştirebilirsiniz:

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

Tam bir kimlik doğrulama ayarı referansı için, internette saatlerce araştırma yaptıktan sonra derlediğim adımlara bakın .


155
O NE LAN?! böyle aptalca bir şey için bir saat kaybettim. Neden userAdminAnyDatabasebunun yerine belgelendiriyorlar root?
akostadinov

15
buradaki fikir, önce yalnızca diğer kullanıcıları yönetmek için kullanılan bir kullanıcı (yani "userAdmin" ile başlayan rol) oluşturmanız ve yalnızca normal kullanıcılarınızı oluşturmanızdır. bu biraz mantıklı, ama ben de ilk seferde doğru alamadım ... @akostadinov
TomTasche

11
Bu benim için MongoDB v3.4.7 üzerinde işe yaramadı:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384

2
Bu kod @Cerin DID benim için çalışmalarını: db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])ve bu yapar beni karıştı. Bir komutu çalıştırma yetkim yok ve yine de kendimi rootlamak için bir komut çalıştırabilir ve sonra bu komutu çalıştırabilirim. Çok garip: S

2
db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])işe yaramadı olanlar için , geri dönmek emin olun use admin... aynı sorunu vardı, geri döndüğümde bir cazibe gibi çalıştı
esko22

37

Biraz kafa karıştırıcı - Bir veritabanını sorgulamak için kendinize readWrite vermeniz gerektiğine inanıyorum. Dbadmin veya useradmin kullanan bir kullanıcı veritabanını yönetebilir (kendinize ek haklar dahil) ancak sorgu gerçekleştiremez veya veri yazamaz.

bu yüzden kendinize okuma yazınız ve iyi olmalısınız -

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


Bu cevabın soru ile alakalı olduğundan emin değilim, ama her iki şekilde de yanlış bilgi veriyor. DbOwner rolü readWrite rolünü içerir: docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
Andy Triggs

10
cevap doğrudur - dbadmin ve useradmin rolleri (orijinal posterin sorduğu şey) readWrite içermez. DbOwner yapar ama orijinal posterin kullandığı ve sorduğu şey bu değildi.
John Petrone

3
Kesinlikle haklısın. Özür. Çok uzun süren rol oynamıştım ve şaşkına dönmüştüm.
Andy Triggs

Yani, gerçek mongodb sunucusuna erişmek için bir yönetici kullanıcısı olabilir ve daha sonra belirli veritabanları için başkalarına sahip olabilir misiniz?
K - SO'da toksisite artıyor.

32

Belki de mevcut bir kullanıcının nasıl değiştirileceğine dair hızlı bir örnek birisine yardımcı olacaktır. Aslında aradığım şey buydu.

@JohnPetrone önerisini takiben grantRolesToUser ile yönetici kullanıcıma readWrite rolü ekledim

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

26

Şunları deneyebilirsiniz: --authenticationDatabase bayrağını kullanmak yardımcı olur.

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

9

Ben bu cevap bu iş parçacığı üzerinde gerçekten geç geliyor biliyorum ama umarım kontrol.

Bu hatayı almanızın nedeni, şu ana kadar topladığınız kullanıcıya verdiğiniz özel role dayanmaktadır ve evet, kullanıcıya bu rolü vermek rootsorununuzu çözecektir, ancak önce bu rollerin onlara vermeden önce tam olarak ne yaptığını anlamalısınız. kullanıcılara.

Öğreticide, kullanıcıya userAdminAnyDatabasetemelde kullanıcıya tüm veritabanlarınızın kullanıcılarını yönetme yeteneği veren bir rol verdiniz . Kullanıcı ile yapmaya çalıştığınız şey rol tanımının dışındaydı.

rootRol o tanımı yanı sıra içerdiği bu role sahiptir readWriteAnyDatabase, dbAdminAnyDatabasebunu bir superuser yapma ve diğer rolleri (temelde onunla her şeyi yapabilir çünkü).

Kullanıcılara belirli görevleri tamamlamaları için hangi rolleri vermeniz gerektiğini görmek için rol tanımlarına göz atabilirsiniz. https://docs.mongodb.com/manual/reference/built-in-roles/ Tüm kullanıcılarınızı süper yapmak tavsiye edilmez :)


Peki, kök değilse, sorunu çözmek için hangi rolü önerirsiniz?
Hendy Irawan

Merhaba, @HendyIrawan, kullanıcılarınızın her birinin tam olarak ne yapmasını istediğinize karar vermenizi ve onlara sadece bunu yapmalarını sağlayan rolü vermenizi öneririm. Örneğin, bir kullanıcının sadece okumasını istiyorsanız (sorunun ne yapmaya çalıştığı da budur show collections), ona bu yeteneği vermeli ve başka bir şey vermemelisiniz roles: [ { role: "read", db: "admin" } ]. Buradaki rolün okunduğuna dikkat edin, bu veritabanına özgüdür ve bundan başka bir şey yapamazsınız. Diğer roller için bu bağlantıya göz atın docs.mongodb.com/manual/reference/built-in-roles
el Punch

Yani buradaki sorunun cevabı (örneğin "değil") "okunur" mu?
Hendy Irawan

Evet. Kullanıcı sadece belirtilen db okuma yeteneğine sahip olacağını unutmayın.
el Punch

2

Bu basit bir soru.

  1. Hedef db NOT admin değiştirmeniz önemlidir .

DB'nizi kullanın

  1. db kimlik doğrulamanızı kontrol edin

kullanıcıları göster

  1. {} Boş bir nesne alırsanız soru budur. Sadece yazmanız gerekiyor

db.createUser ({kullanıcı: "yourUser", pwd: "şifre", roller: ["readWrite", "dbAdmin"]})

veya

db.grantRolesToUser ('kullanıcınız', [{role: "dbAdmin", db: "yourDB"}])


0

Windows ortamında benzer bir sorun yaşadım: Bitnami DreamFactory'yi yükledim ve ayrıca sistem önyüklemesinde başlatılan başka bir MongoDb yükler. Benim MongoDbService çalışıyordu (bu herhangi bir hata olmadan başladı) ama ben aslında Bitnami'nin MongoDb Servisi bağlanmakta çok zaman kaybettikten sonra fark ettim. Sunucunuzda çalışan başka bir mongoDB örneği yoksa lütfen bir göz atın.

İyi şanslar!


2
Bu cevabın neden reddedildiğini bilmiyorum; bu meşru bir öneri. Örneğin, Tomcat'i kaputun altında çalıştıran bir yönetim konsoluna girdim. Yerel bir sunucuyu (herhangi bir türde) başlatırsanız, bağlanmaya çalışarak çalışıp çalışmadığını kontrol edersiniz. Bu ilk bağlantı başarılı olacaktır. Daha sonra sunucunuzun günlüklerini kontrol etmeden ve sunucunuzun istenen bağlantı noktasına bağlanamadığını fark etmeden önce "gizli" sunucuyla güreşeceksiniz.
Paul

0

Ayrıca, mongo kabuğu istemciniz mongodörneğe doğru bir şekilde bağlanamazsa , bu tür "İzin Reddedildi" hatalarını alabileceğinizi unutmayın.

Bağlantı portunu kontrol ederek istemcinizin bir bağlantı açtığından emin olun, ancak kullandığınız portun mongodkullanımda olmadığından emin olun . --port <port>Hem kabuktaki hem de işlemdeki parametreyi kullanarak farklı bir bağlantı noktası ayarlayabilirsiniz .


0

MongoDB Pusula benim ana bilgisayar adı yerine benim proje için yönetici işaret ediyordu çünkü bu sorun vardı . Ana bilgisayar adından sonra / projectname eklenerek düzeltildi :) Bunu deneyin:

  1. Projenizi şuradan seçin: MongoDB atlas web sitesinden
  2. MongoDB Compass ile Bağlan / Bağlan
  3. Pusulayı İndirin / İşletim Sisteminizi Seçin
  4. Compass 1.12 veya üstünü kullandım
  5. Bağlantı dizesini Pusula 1.12 veya sonraki sürümleri altına kopyalayın.
  6. MongoDB Pusula / Bağlan (sol üst) / Bağlan'ı açın
  7. Bağlantı Dizesi algılandı / Evet /
  8. Ana makine adından sonra proje adınızı ekleyin: cluster9-foodie.mongodb.net/ projectname
  9. API'yı POSTMAN ile bağlayın ve test edin.
  10. Başarılı.

Kodunuzda da aynı bağlantı dizesini kullanın:

  1. Önce:
    • mongodb + srv: // proje adı : şifre @ cluster9-foodie.mongodb.net / admin
  2. Sonra:
    • mongodb + srv: // projectname: şifre @ cluster9-foodie.mongodb.net / projectname

İyi şanslar.


0

mydb
db.createUser ({user: "test", pwd: "secret", roller: ["readWrite", "dbAdmin"], passwordDigestor: "sunucu"})


0

Yönetici db için kimlik doğrulaması yapmanız gerektiğini ve DB'den 'yerel ana bilgisayar istisnasını' önleyecek doğru ayrıcalıklara sahip olması gerektiğini kabul etti (bu, mongoDB'nin şirket içinde barındırılanları içindir), ancak her şey yerinde ve yine de hemen hemen her komutta yetkili olmayan istisnalar elde edilmezken , Mongo Atlas kullanılarak oluşturulan mongoDB'ye erişirken , nedenini bildiğiniz yer burada, neden:

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

ve ayrıca mongoDB'yi mongo Atlas'ta ev sahipliği yaptıysanız da kontrol edin :

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
Kısa süreli sınırlı yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Uygun bir açıklama , bunun neden problem için iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
Toby Speight

0

MongoDB 4.2 için Centos 7'de bu adımları izledim. (Uzak kullanıcı)

Mongod.conf dosyasını güncelleyin

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

MongoDB hizmet iblisini başlat

systemctl start mongod

MongoDB kabuğunu aç

mongo

Kabukta bu komutu yürütün

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

Uzak kök kullanıcı oluşturuldu. Şimdi bu veritabanı bağlantısını geliştirici makinenizdeki herhangi bir MongoDB GUI aracını kullanarak test edebilirsiniz. Gibi Robo 3T


-10

Bunun nedeni, mongodb.conf dosyasında noAuth = true ayarlamasını engellemeniz olabilir.

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

Bunu ayarladıktan sonra şunu kullanarak hizmeti yeniden başlatın:

hizmet mongod yeniden başlatma


1
Kullanıcı, yetkilendirmeyi kullanmaya başlamak istediğini açıkça belirtmektedir, bu nedenle uncommented auth = true. Yetkilendirmeyi neden devre dışı bırakmayı öneriyorsunuz?
Alex 75

Sanırım sorunu okumadınız ... OP, kullanıcıyı ayarlamak için s-hunter'ın yanıtını ve özel bir yapılandırmaya bağlanmak için jremi'nin bir kombinasyonunu istiyor
ChrisN
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.