Không thể xác thực thành mongo, "xác thực không thành công"


90

Tôi đã tạo người dùng quản trị cho mongo bằng cách sử dụng các hướng dẫn sau:

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

Từ ứng dụng mongo, có vẻ như tôi có thể xác thực:

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

Nhưng tôi không thể kết nối bất kỳ cách nào khác. Ví dụ:

mongo -u admin -p SECRETPASSWORD

đưa ra lỗi:

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

Tôi có auth = truetrong etc/mongod.conf.

Tôi đang thiếu gì?


1
Có lẽ Mongo được cấu hình để chỉ chấp nhận các kết nối từ localhost? Điều đó ít nhất đã xảy ra với tôi khi sử dụng phiên bản mongodb sản xuất của chúng tôi khi cố gắng truy cập nó từ máy tính của tôi.
Akku

Tôi không nghĩ vậy, tôi nhận được thông báo lỗi đó khi kết nối từ cùng một máy với mongod. Ngoài ra, nó cho phép tôi kết nối mà không cần cung cấp tên người dùng / mật khẩu và sau đó cung cấp tên người dùng / mật khẩu với db.auth (ví dụ đầu tiên của tôi).
justkevin

PS: db.changeUserPassword("admin", "password")để thay đổi mật khẩu cho từng cơ sở dữ liệu.
laggingreflex

Câu trả lời:


100

Xác thực được quản lý ở cấp độ cơ sở dữ liệu. Khi bạn cố gắng kết nối với hệ thống bằng cơ sở dữ liệu, mongo sẽ thực sự kiểm tra thông tin đăng nhập bạn cung cấp trong bộ sưu tập <database>.system.users. Vì vậy, về cơ bản khi bạn đang cố gắng kết nối với "kiểm tra", nó sẽ tìm thông tin đăng nhập test.system.usersvà trả về lỗi vì nó không thể tìm thấy chúng (khi chúng được lưu trữ trong admin.system.users). Có quyền đọc và ghi từ tất cả các db không có nghĩa là bạn có thể kết nối trực tiếp với chúng.

Trước tiên, bạn phải kết nối với cơ sở dữ liệu có thông tin đăng nhập. Thử:

mongo admin -u admin -p SECRETPASSWORD

Để biết thêm thông tin, hãy xem http://docs.mongodb.org/manual/reference/privilege-documents/ này


4
cũng như được đề cập dưới đây, trong câu trả lời khác (nhưng tôi đã bỏ lỡ nó, vì tôi chỉ nhìn ở đầu bình chọn những người thân) tôi cần thêm dấu nháy đơn xung quanh tên truy cập và mật khẩu, trước khi tôi có thể đăng nhập
gsaslis

Đúng vậy, nếu bạn sử dụng dấu ngoặc kép, kẻ ngu ngốc có thể sẽ làm tất cả những điều tồi tệ.
moodboom

73

Tôi cũng nhận được lỗi này, những gì tôi cần là chỉ định cơ sở dữ liệu nơi dữ liệu xác thực người dùng được lưu trữ:

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

Cập nhật ngày 18 tháng 11 năm 2017:

mongo admin -u admin -p

là một giải pháp tốt hơn. Mongo sẽ nhắc bạn nhập mật khẩu của bạn, bằng cách này, bạn sẽ không đưa mật khẩu văn bản rõ ràng của mình vào lịch sử shell, đây chỉ là một phương pháp bảo mật tồi tệ.


2
Vâng, câu trả lời này hoạt động! Kết hợp điều này với câu trả lời từ @gilo, lệnh sau phù hợp với tôi: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo

38

Bạn có thể cần phải nâng cấp trình bao mongo của mình. Tôi đã có phiên bản 2.4.9 của trình bao mongo cục bộ và tôi gặp lỗi này khi cố gắng kết nối với cơ sở dữ liệu mongo 3. Nâng cấp phiên bản shell lên 3 đã giải quyết được vấn đề.


7
Như đã nêu trong tài liệu: Các phiên bản của trình bao mongo trước 3.0 không tương thích với việc triển khai MongoDB 3.0 thực thi kiểm soát truy cập. Nếu bạn có triển khai MongoDB 3.0 yêu cầu kiểm soát truy cập, bạn phải sử dụng phiên bản 3.0 của mongo shell.
Finch_Powers

32

Tôi biết điều này có vẻ hiển nhiên nhưng tôi cũng phải sử dụng một trích dẫn duy nhất xung quanh u / n và p / w trước khi nó hoạt động

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


2
Tôi vấp phải câu trả lời của bạn vì mongo -u <myuser> -p <mypasswdnó không hoạt động. Tại sao lại admintạo ra sự khác biệt, ở đây?
blz

2
nó yêu cầu mongo sử dụng quản trị cơ sở dữ liệu. nếu bạn tạo một cơ sở dữ liệu, và sử dụng assign để cơ sở dữ liệu, sau đó nó sẽ được Mongo <another_database> -u -p sử dụng mật khẩu
Afriyandi Setiawan

Cảm ơn bạn rất nhiều. Điều này thực sự kỳ lạ, tôi đã không sử dụng dấu ngoặc kép và dấu ngoặc kép nó không hoạt động. Thật là ngớ ngẩn.
rỉ sét

20

Trong MongoDB 3.0, nó hiện hỗ trợ nhiều cơ chế xác thực.

  1. MongoDB Challenge and Response (SCRAM-SHA-1) - mặc định trong 3.0
  2. Thử thách và phản hồi MongoDB (MONGODB-CR) - mặc định trước đó (<3.0)

Nếu bạn bắt đầu với cơ sở dữ liệu 3.0 mới với những người dùng mới được tạo, họ sẽ được tạo bằng SCRAM-SHA-1.

Vì vậy, bạn sẽ cần một trình điều khiển có khả năng xác thực đó:

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

Nếu bạn đã nâng cấp cơ sở dữ liệu từ 2.x với dữ liệu người dùng hiện có, họ sẽ vẫn sử dụng MONGODB-CR và cơ sở dữ liệu xác thực người dùng sẽ phải được nâng cấp:

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

Bây giờ, kết nối với MongoDB 3.0 với người dùng được tạo bằng SCRAM-SHA-1 được yêu cầu chỉ định cơ sở dữ liệu xác thực (thông qua ứng dụng mongo dòng lệnh) và sử dụng các cơ chế khác nếu sử dụng trình điều khiển.

$> mongo -u USER -p MẬT KHẨU --authenticationDatabase admin

Trong trường hợp này, cơ sở dữ liệu "quản trị", cũng là cơ sở dữ liệu mặc định sẽ được sử dụng để xác thực.


Thay đổi hành vi này rất quan trọng, vì nó đã khiến tôi vấp phải khi trộn phiên bản MongoDB mới và phiên bản cũ của pymongo. Bạn cần đảm bảo phiên bản mongo của mình và tất cả ứng dụng mongo đều được cập nhật.
i_grok

Đây là trường hợp của tôi: 1. Thay đổi Mongo-java-lái-2.12.3.jar để Mongo-java-lái-3.2.2.jar 2. Thay đổi MongoCredential.createMongoCRCredential để MongoCredential.createCredential
nikolai.serdiuk

ugh. cách cứng nó sẽ là cho các nhà phát triển để cung cấp cho chúng ta một lỗi tốt hơn như "phương pháp xác thực không hợp lệ"
Byron Whitlock

13

vẻ như vấn đề là người dùng được tạo thông qua phương thức được mô tả trong tài liệu mongo không có quyền kết nối với cơ sở dữ liệu mặc định (thử nghiệm), ngay cả khi người dùng đó được tạo với vai trò "userAdminAnyDatabase" và "dbAdminAnyDatabase".


có cùng một vấn đề. Sức mạnh của họ là một cách để sử dụng db admin như mặc định thay vì thử nghiệm
Idan Shechter

13

Điều này đã khắc phục sự cố của tôi:

Đi đến trình bao đầu cuối và nhập mongo.

Sau đó gõ use db_name.

Sau đó gõ:

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

Cũng cố gắng: db.getUsers()

Mẫu nhanh:

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
Để thêm: 1. Đăng nhập vào cơ sở dữ liệu quản trị với MongoDB trị cấp cao đầu tiên: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. Sau đó chuyển sang cơ sở dữ liệu mục tiêu: > use targetDb 3. Sau đó, thêm người dùng> db.createUser(...)
daniel.widyanto

3

Một khả năng khác: Khi bạn tạo người dùng, bạn có thể đã vô tình nhập vào usemột cơ sở dữ liệu khác với adminhoặc khác với cơ sở bạn muốn. Bạn cần đặt --authenticationDatabasecơ sở dữ liệu mà người dùng đã thực sự được tạo.

mongodbdường như đưa bạn vào testcơ sở dữ liệu theo mặc định khi bạn mở vỏ, vì vậy bạn cần phải viết --authenticationDatabase testchứ không phải là --authenticationDatabase adminnếu bạn vô tình bị useing testkhi bạn chạy db.createUser(...).

Giả sử bạn có quyền truy cập vào máy đang chạy phiên bản mongodb, y có thể vô hiệu hóa ủy quyền trong /etc/mongod.conf(nhận xét authorizationđược lồng trong bảo mật), sau đó khởi động lại máy chủ của bạn, rồi chạy:

mongo
show users

Và bạn có thể nhận được một cái gì đó như thế này:

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

Chú ý rằng dbgiá trị bằng test. Đó là bởi vì khi tôi tạo người dùng, lần đầu tiên tôi không chạy use adminhoặc use desiredDatabaseName. Vì vậy, bạn có thể xóa người dùng với db.dropUser("myusername")và sau đó tạo một người dùng khác trong cơ sở dữ liệu mong muốn của bạn như sau:

use desiredDatabaseName
db.createUser(...)

Hy vọng rằng điều đó sẽ giúp ích cho ai đó từng ở vị trí của tôi với tư cách là một noob với công cụ này.


3

Không giống như MYSQl và hầu hết các RDBMS, MongoDB có một thiết lập khác.

Nó không đi kèm với người dùng xác thực cơ bản có sẵn đã được thiết lập, bạn cần phải thiết lập thủ công. Bạn cần phải truy cập Mongo.conf và bật Ủy quyền, Vui lòng kích hoạt nó một cách thận trọng nếu không làm như vậy sẽ gây ra lỗi khi khởi động phiên bản mongo của bạn. Sau đó, bạn kiểm tra xem máy chủ mongo của bạn đã khởi động hay chưa.

Bước tiếp theo là Bật ủy quyền trong Mongo với tư cách người dùng: -

Chúng tôi cần tạo một người dùng có quyền truy cập root và thay đổi cấu hình xác thực mongo.

Chuyển sang Quản trị viên DB: -

use admin

Tạo người dùng với Root Privilage: -

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

Thay đổi mongo.conf của bạn thành Bật ủy quyền: -

security:
    authorization: "enabled"

Vui lòng xem qua hướng dẫn từng bước này để Thiết lập auth trong MongoDB.


2

Đây là một loại trường hợp cụ thể, nhưng trong trường hợp có ai đó ở đây với vấn đề của tôi:

Trong MongoHQ, nó sẽ hiển thị cho bạn một trường gọi là "mật khẩu", nhưng thực ra nó chỉ là băm của mật khẩu. Bạn sẽ phải thêm người dùng mới và lưu trữ mật khẩu ở nơi khác (vì MongoHQ sẽ không hiển thị mật khẩu cho bạn).


2

Cách thích hợp để đăng nhập vào mongo shell là

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


1

Bạn cũng có thể thử điều này: -

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

Tìm thấy nó trong bài đăng này

Ở đây rõ ràng localhost có thể là một số máy chủ khác và / admin có thể là một số cơ sở dữ liệu khác mà xác thực đã được áp dụng


0

Kiểm tra phiên bản mongo của máy khách mà chúng tôi đang kết nối với máy chủ mongo.

Trường hợp của tôi, máy chủ mongo là phiên bản Mongo4.0.0 nhưng máy khách của tôi là phiên bản 2.4.9. Cập nhật phiên bản mongo để cập nhật mongo cli.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.