MongoDB - người dùng quản trị không được ủy quyền


200

Tôi đang cố gắng thêm quyền vào MongoDB của mình.
Tôi đang làm tất cả điều này trên Linux với MongoDB 2.6.1.
Tệp mongod.conf của tôi có định dạng tương thích cũ
(đây là cách nó đi kèm với cài đặt).

1) Tôi đã tạo người dùng quản trị như được mô tả ở đây trong (3)

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

2) Sau đó tôi đã chỉnh sửa mongod.conf bằng cách bỏ dòng này

auth = true

3) Cuối cùng tôi đã khởi động lại dịch vụ mongod và tôi đã cố gắng đăng nhập bằng:

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

4) Tôi có thể kết nối nhưng nó nói điều này khi kết nối.

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) Bây giờ có vẻ như sangười dùng này tôi tạo không có quyền gì cả.

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

Vấn đề là gì? Tôi đã lặp lại toàn bộ quy trình này 3 lần và
tôi nghĩ rằng tôi đã làm tất cả như được chỉ định trong các tài liệu MongoDB. Nhưng nó không hoạt động.
Tôi đã mong đợi sangười dùng này được ủy quyền để làm bất cứ điều gì để
sau đó anh ta có thể tạo người dùng khác và cung cấp cho họ quyền cụ thể hơn.


20
Điều này rất khó chịu hoặc tài liệu xấu. Tôi đã đấu tranh bản thân mình ở đó. Cuối cùng, tôi có một người dùng với vai trò "root" toàn cầu và mọi người vẫn không thể thực hiện một số việc như thực thi các lệnh ...
ToBe

Câu trả lời:


471

Tôi cũng đang suy nghĩ về vấn đề tương tự và mọi thứ đã hoạt động sau khi tôi đặt vai trò là root khi thêm người dùng quản trị viên đầu tiên.

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

Nếu bạn đã tạo adminngười dùng, bạn có thể thay đổi vai trò như sau:

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

Để tham khảo cài đặt xác thực hoàn chỉnh, hãy xem các bước tôi đã biên soạn sau nhiều giờ nghiên cứu qua internet.


154
WTF?! mất một giờ cho một điều ngu ngốc như thế này. Tại sao họ đưa vào tài liệu userAdminAnyDatabasethay vì root?
akostadinov

15
ý tưởng là trước tiên bạn tạo một người dùng chỉ được sử dụng để quản trị người dùng khác (do đó vai trò bắt đầu bằng "userAdmin") và sau đó chỉ tạo người dùng bình thường của bạn. điều này thật có ý nghĩa, nhưng tôi đã không hiểu nó lần đầu tiên ngay ... @akostadinov
TomTasche

10
Điều này không hoạt động với tôi trên MongoDB v3.4.7:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384

2
@Cerin Mã này DID hoạt động với tôi : db.grantRolesToUser('admin',[{ role: "root", db: "admin" }]), và điều đó làm tôi bối rối. Tôi không được phép chạy một lệnh, nhưng tôi có thể chạy một lệnh để tự root, và sau đó chạy lệnh đó. Rất lạ: S

2
đối với những người db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])không hoạt động, hãy đảm bảo bạn chuyển trở lại use admin... có cùng một vấn đề, một khi tôi chuyển trở lại thì nó hoạt động như một

37

Điều này hơi khó hiểu - Tôi tin rằng bạn sẽ cần phải cấp cho chính mình readWrite để truy vấn cơ sở dữ liệu. Người dùng có dbadmin hoặc useradmin có thể quản trị cơ sở dữ liệu (bao gồm cấp cho mình quyền bổ sung) nhưng không thể thực hiện truy vấn hoặc ghi dữ liệu.

vì vậy hãy tự cấp cho mình readWrite và bạn sẽ ổn thôi -

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


Tôi không chắc câu trả lời này có liên quan đến câu hỏi, nhưng dù bằng cách nào thì nó cũng cung cấp thông tin không chính xác. Vai trò dbOwner bao gồm vai trò readWrite: docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
Andy Triggs

10
câu trả lời là đúng - vai trò của dbadmin và useradmin (đó là những gì người đăng ban đầu đã hỏi) không bao gồm readWrite. Dbwwner làm nhưng đó không phải là những gì người đăng ban đầu đang sử dụng và đang hỏi về.
John Petrone

3
Bạn hoàn toàn đúng. Lời xin lỗi. Tôi đã trải qua quá nhiều vai trò lộn xộn và bị bối rối.
Andy Triggs

Vì vậy, bạn có thể có một người dùng quản trị để truy cập vào máy chủ mongodb thực tế, và sau đó có những người khác cho cơ sở dữ liệu cụ thể?
K - Độc tính trong SO đang tăng lên.

32

Có lẽ một ví dụ nhanh về cách thay đổi người dùng hiện tại sẽ hữu ích cho ai đó. Đây là những gì tôi đã thực sự tìm kiếm.

Theo lời khuyên của @JohnPetrone, tôi đã thêm vai trò readWrite cho người dùng quản trị của mình bằng GrantRolesToUser

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

26

Bạn có thể thử: Sử dụng cờ --authenticationDatabase giúp.

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

8

Tôi biết câu trả lời này sẽ đến rất muộn trong chủ đề này nhưng tôi hy vọng bạn kiểm tra nó.

Lý do bạn gặp lỗi đó dựa trên vai trò cụ thể mà bạn đã cấp cho người dùng mà bạn đã thu thập được bây giờ và có cho người dùng đó vai trò đó rootsẽ giải quyết vấn đề của bạn nhưng trước tiên bạn phải hiểu chính xác những vai trò này làm gì trước khi cấp cho họ cho người dùng.

Trong hướng dẫn, bạn đã cấp cho người dùng userAdminAnyDatabasevai trò cơ bản cung cấp cho người dùng khả năng quản lý người dùng của tất cả các cơ sở dữ liệu của bạn. Những gì bạn đã cố gắng làm với người dùng của bạn nằm ngoài định nghĩa vai trò của nó.

Các rootvai trò có vai trò này bao gồm trong nó định nghĩa cũng như readWriteAnyDatabase, dbAdminAnyDatabasevà vai trò khác làm cho nó một superuser (về cơ bản bởi vì bạn có thể làm bất cứ điều gì với nó).

Bạn có thể kiểm tra các định nghĩa vai trò để xem vai trò nào bạn sẽ cần cung cấp cho người dùng để hoàn thành một số tác vụ nhất định. https://docs.mongodb.com/manual/reference/built-in-roles/ Không nên làm cho tất cả người dùng của bạn trở thành siêu nhân :)


Vì vậy, nếu không root, bạn đề nghị vai trò gì để giải quyết vấn đề?
Hendy IINA

Xin chào @HendyI Girls, tôi sẽ đề nghị bạn quyết định chính xác những gì bạn muốn mỗi người dùng của bạn có thể làm và cung cấp cho họ vai trò cho phép họ làm điều đó. Ví dụ: nếu bạn chỉ muốn người dùng đọc (đó là những gì câu hỏi cố gắng thực hiện show collections), bạn nên cung cấp cho nó khả năng đó và không có gì khác roles: [ { role: "read", db: "admin" } ]. Lưu ý rằng vai trò ở đây được đọc, đây là cơ sở dữ liệu cụ thể và bạn không thể làm gì khác ngoài điều đó. Kiểm tra liên kết này cho các vai trò khác docs.mongodb.com/manual/reference/built-in-roles
el Punch

Vì vậy, câu trả lời cho câu hỏi ở đây (không phải "ví dụ") là "đọc"?
Hendy I Girls

Đúng. Lưu ý rằng người dùng sẽ chỉ có khả năng đọc db được chỉ định.
el Punch

2

Đó là một câu hỏi đơn giản.

  1. Điều quan trọng là bạn phải chuyển đổi db đích KHÔNG phải là quản trị viên.

sử dụng yourDB

  1. kiểm tra xác thực db của bạn bằng cách

hiển thị người dùng

  1. Nếu bạn nhận được một {} đối tượng trống đó là câu hỏi. Bạn chỉ cần gõ

db.createUser ({user: "yourUser", pwd: "password", vai trò: ["readWrite", "dbAdmin"]})

hoặc là

db.grantRolesToUser ('yourUser', [{vai trò: "dbAdmin", db: "yourDB"}])


0

Tôi đã gặp một vấn đề tương tự ở đây trên môi trường Windows: Tôi đã cài đặt Bitnami DreamFactory và nó cũng cài đặt một MongoDb khác được khởi động khi khởi động hệ thống. Tôi đang chạy MongoDbService của mình (đã bắt đầu mà không có lỗi) nhưng tôi nhận thấy sau khi mất rất nhiều thời gian tôi thực sự kết nối với Dịch vụ MongoDb của Bitnami. Xin vui lòng, hãy xem nếu không có phiên bản khác của mongoDB đang chạy trên máy chủ của bạn.

Chúc may mắn!


2
Tôi không biết tại sao câu trả lời này bị hạ thấp; đây là một đề nghị chính đáng Ví dụ: tôi đã chạy vào bảng điều khiển quản lý đang chạy Tomcat dưới mui xe. Nếu bạn khởi động một máy chủ cục bộ (thuộc bất kỳ loại nào), bạn có thể sẽ kiểm tra xem nó có chạy hay không bằng cách thử kết nối với nó. Kết nối đầu tiên đó sẽ thành công. Sau đó, bạn sẽ vật lộn với máy chủ "ẩn" trước khi kiểm tra nhật ký của máy chủ và nhận thấy rằng máy chủ của bạn không thể liên kết với cổng mong muốn.
Paul

0

Ngoài ra, lưu ý rằng nếu máy khách shell mongo của bạn không kết nối chính xác với mongodthể hiện, bạn có thể nhận được các lỗi "Quyền bị từ chối" như vậy.

Đảm bảo rằng máy khách của bạn mở kết nối bằng cách kiểm tra cổng kết nối, nhưng cũng có thể cổng bạn đang sử dụng mongodkhông được sử dụng. Bạn có thể đặt một cổng khác bằng cách sử dụng --port <port>tham số trong cả trình bao và quy trình.


0

Tôi gặp vấn đề này vì tên máy chủ trong MongoDB La bàn của tôi đã trỏ đến quản trị viên thay cho dự án của tôi. Đã sửa lỗi bằng cách thêm / tên dự án sau tên máy chủ :) Hãy thử điều này:

  1. Chọn dự án của bạn trong trang web tập bản đồ MongoDB
  2. Kết nối / Kết nối với MongoDB La bàn
  3. Tải xuống La bàn / Chọn hệ điều hành của bạn
  4. Tôi đã sử dụng La bàn 1.12 trở lên
  5. Sao chép chuỗi kết nối dưới La bàn 1.12 trở lên.
  6. Mở MongoDB La bàn / Kết nối (trên cùng bên trái) / Kết nối với
  7. Chuỗi kết nối được phát hiện / Có /
  8. Nối tên dự án của bạn sau tên máy chủ: cluster9-foodie.mongodb.net/ tên dự án
  9. Kết nối và kiểm tra API với POSTMAN.
  10. Thành công.

Sử dụng cùng một chuỗi kết nối trong mã của bạn:

  1. Trước:
    • mongodb + srv: // tên dự án: password @ cluster9-foodie.mongodb.net / admin
  2. Sau:
    • MongoDB + srv: // projectname: password @ cluster9-foodie.mongodb.net / projectname

Chúc may mắn.


0

sử dụng mydb
db.createUser ({user: "test", pwd: "secret", vai trò: ["readWrite", "dbAdmin"], passwordDigestor: "server"})


0

Đồng ý rằng bạn đã được xác thực với quản trị viên db và cần ít nhất một vai trò với các đặc quyền chính xác để tránh 'ngoại lệ máy chủ cục bộ' từ DB (điều này dành cho mongoDB được lưu trữ tại chỗ), mặc dù bạn đã có mọi thứ nhận được các ngoại lệ không được ủy quyền trên hầu hết mọi lệnh, trong khi truy cập mongoDB được tạo bằng Mongo Atlas , thì đây là nơi bạn có thể biết lý do, tại sao:

/dba/219003/not- trái phép

và cũng kiểm tra điều này nếu bạn đã lưu trữ mongoDB trên mongo Atlas :

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" 
    ]
    }
    )

Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp ngắn hạn. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
Toby Speight

0

Tôi đã làm theo các bước này trên Centos 7 cho MongoDB 4.2. (Người dùng từ xa)

Cập nhật tập tin mongod.conf

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

Bắt đầu quỷ dịch vụ MongoDB

systemctl start mongod

Mở vỏ MongoDB

mongo

Thực hiện lệnh này trên shell

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

Người dùng root từ xa đã được tạo. Bây giờ bạn có thể kiểm tra kết nối cơ sở dữ liệu này bằng cách sử dụng bất kỳ công cụ GUI MongoDB nào từ máy dev của bạn. Giống như Robo 3T


-10

Điều này có thể là do bạn chưa đặt noAuth = true trong mongodb.conf

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

Sau khi cài đặt, khởi động lại dịch vụ bằng

dịch vụ mongod khởi động lại


1
Người dùng nói rõ ràng rằng anh ta muốn bắt đầu sử dụng ủy quyền do đó anh ta không bị lỗi auth = true. Tại sao bạn đề nghị vô hiệu hóa ủy quyền!?
Alex 75

Tôi đoán bạn đã không đọc được vấn đề ... OP muốn auth, một sự kết hợp giữa phản hồi của s-hunter để đặt người dùng và jremi để kết nối với một cấu hình tùy chỉnh
ChrisN
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.