MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Xác thực sau khi chọn cơ sở dữ liệu

Có vẻ như bạn đang thiếu một số khái niệm ở đây vì vậy về cơ bản tôi sẽ trả lời như một "hướng dẫn" cho những gì bạn nên làm thay vào đó. Vì vậy, "xác thực" không thực sự là điều bạn làm "sau" kết nối, mà bạn cần phải "tìm kiếm đúng chỗ" khi thực sự cố gắng xác thực.

Về cơ bản, chúng tôi có thể bắt đầu việc này bằng cách thực hiện theo quy trình được nêu trong Bật xác thực từ tài liệu cốt lõi, nhưng được thay đổi cụ thể vì bạn muốn chạy "thử nghiệm" này trong tài khoản người dùng và thư mục cục bộ của riêng bạn.

Các bước sửa đổi - Trực tiếp từ Tài liệu

Vì vậy, đầu tiên sẽ muốn chọn một thư mục làm việc cục bộ và tạo đường dẫn cho các tệp lưu trữ cơ sở dữ liệu bên dưới đó. Trên các hệ thống dựa trên * nix, bạn có thể thực hiện một số việc như:

mkdir -p scratch/data/db
cd scratch

Sau đó, chúng tôi muốn khởi động một cá thể MongoDB riêng biệt mà không có bất kỳ tùy chọn nào khác. Đảm bảo rằng cổng không xung đột với bất kỳ phiên bản đang chạy nào khác:

mongod --port 37017 --dbpath data/db

Trong một cửa sổ dòng lệnh hoặc dòng lệnh mới, sau đó bạn có thể kết nối với shell:

mongo --port 37017

Bạn luôn muốn có ít nhất một tài khoản có đặc quyền quản trị để ít nhất "tạo tài khoản" và thay đổi chúng trong trường hợp bạn gặp sự cố, vì vậy hãy tạo một tài khoản:

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

Bây giờ thoát khỏi shell và đóng mongod hiện có ví dụ đang chạy trong thiết bị đầu cuối hoặc dấu nhắc lệnh khác và sau đó bắt đầu lại nó bằng cách sử dụng --auth :

mongod --auth --port 37017 --dbpath data/db

Người dùng cụ thể - Đảm bảo bạn làm theo những điều này

Bây giờ bạn thực sự muốn tạo một người dùng sẽ được "sử dụng bởi ứng dụng của bạn". Vì vậy, các bước này rất quan trọng để đảm bảo bạn thực hiện đúng.

Đăng nhập vào shell bằng "người dùng quản trị" của bạn:

mongo -u admin -p admin --port 37017 --authenticationDatabase 'admin'

Bạn có thể thực hiện luân phiên db.auth() như được hiển thị trong câu hỏi, nhưng như đã lưu ý, điều này phải được ủy quyền trên "admin" không gian tên.

Điều tiếp theo bạn muốn làm là tạo người dùng có quyền truy cập vào "mydb" dưới dạng không gian tên với readWrite vai diễn. Đối với kick, chúng tôi cũng sẽ cho phép người dùng này có readAnyDatabase cho phép họ "liệt kê" tất cả các không gian tên của cơ sở dữ liệu, nếu không thực sự có thể làm bất cứ điều gì khác với chúng.

use admin
db.createUser(
  {
    "user": "myuser",
    "pwd": "password",
    "roles": [
      { "role": "readWrite", "db": "mydb" },
      "readAnyDatabase"
    ]
  }
)

Chỉ để có thêm đầu ra, hãy xem xét những người dùng được tạo hiện tại:

db.getUsers()
[
        {
                "_id" : "admin.admin",
                "user" : "admin",
                "db" : "admin",
                "roles" : [
                        {
                                "role" : "userAdminAnyDatabase",
                                "db" : "admin"
                        }
                ]
        },
        {
                "_id" : "admin.myuser",
                "user" : "myuser",
                "db" : "admin",
                "roles" : [
                        {
                                "role" : "readWrite",
                                "db" : "mydb"
                        },
                        {
                                "role" : "readAnyDatabase",
                                "db" : "admin"
                        }
                ]
        }
]

Xem chúng đã mở rộng như thế nào trong việc đặt tên và đặc biệt là các giá trị được gán cho các "db" khác nhau trên mỗi người dùng. Điều này sẽ cung cấp cho bạn một chút thông tin chi tiết hơn về cách MongoDB tìm kiếm thông tin này và tại sao.

Kết nối Python

Cuối cùng, chúng tôi chỉ muốn kết nối từ python. Vì vậy, giả sử bạn đã cài đặt python và pymongo, thì đó chỉ là một danh sách đơn giản để xác minh:

import pymongo
from pymongo import MongoClient
client = MongoClient('mongodb://myuser:[email protected]:37017');

db = client['mydb']
col = db.test

col.remove()

col.insert_one({ "a": 1 })

for doc in col.find():
  print(doc)

Hiển thị tài liệu được tạo và liệt kê mà không có vấn đề gì:

{u'a': 1, u'_id': ObjectId('5a08e5e0760108251722a737')}

Lưu ý rằng chúng tôi thực sự không cần đề cập đến "admin" tại đây, bởi vì đây là mặc định mà trình điều khiển "mong đợi các tài khoản sẽ ở đó" và nơi bạn thực sự "nên" làm điều đó.

Nhưng tôi đã làm sai cách

Vì vậy, giả sử ban đầu bạn hoàn toàn nhầm lẫn và đã tạo người dùng dưới "mydb" thay vào đó:

use mydb
db.createUser({ "user": "bert", "pwd": "password", "roles": ["readWrite"] })

Nếu bạn truy cập vào "admin" người dùng đó không có ở đó. Nhưng nếu bạn xem trên "mydb" :

use mydb
db.getUsers()
[
        {
                "_id" : "mydb.bert",
                "user" : "bert",
                "db" : "mydb",
                "roles" : [
                        {
                                "role" : "readWrite",
                                "db" : "mydb"
                        }
                ]
        }
]

Vì vậy, bạn có thể xem dữ liệu người dùng thực tế hiện được lưu giữ ở đâu và dữ liệu đó đã được ghi lại như thế nào.

Trường hợp đơn giản ở đây là bạn "phải" cho MongoDB biết nơi lấy xác thực cho người dùng này:

client = MongoClient('mongodb://bert:[email protected]:37017/mydb');

Xem cách chúng tôi thêm "mydb" vào chuỗi kết nối. Đây là cách nó được thực hiện.

Điều này thực sự "đang được tiến hành" để được thực hiện nhất quán với TẤT CẢ các trình điều khiển về cách kết nối được thực hiện và nơi xác thực xảy ra cũng như nơi bạn chọn cơ sở dữ liệu. Nhưng có những quy tắc cơ bản:

  1. Nếu không có vùng tên cơ sở dữ liệu nào khác được cung cấp chi tiết kết nối cho thông tin xác thực thì "admin" được coi là mặc định .

  2. Khi có một vùng tên cơ sở dữ liệu được cung cấp trên chuỗi kết nối, vùng này sẽ được sử dụng để xác thực và đây là mục đích thực tế của không gian tên cơ sở dữ liệu trên chuỗi kết nối.

  3. Mặc dù các trình điều khiển khác "hiện tại" khác nhau về vai trò của không gian tên cơ sở dữ liệu trên chuỗi kết nối, cách sử dụng đang được thay đổi để phù hợp với tất cả các trình điều khiển mà "sử dụng" không gian tên cơ sở dữ liệu trên thực tế là một lệnh gọi API, thay vì được gán từ chuỗi kết nối.

Vì vậy, nơi bạn cần xác thực phụ thuộc vào "nơi bạn tạo người dùng". Nhưng bạn thực sự cần lưu ý rằng "admin" là nơi mà bạn "nên" làm việc này thay vì bất kỳ nơi nào khác.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tìm trong Double Nested Array MongoDB

  2. Truy vấn phạm vi MongoDB trên toàn bộ giá trị tài liệu được nhúng

  3. Kết nối với MongoDB Atlas từ các chức năng của firebase

  4. Mongodb:db.collection.copyTo () và eval () không được dùng nữa. Các lựa chọn thay thế là gì?

  5. Không thể ghi bộ đệm vào MongoDB GridFS