MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Otentikasi Setelah Memilih Database

Anda tampaknya kehilangan beberapa konsep di sini jadi pada dasarnya saya akan menjawab sebagai "panduan" untuk apa yang seharusnya Anda lakukan. Jadi "otentikasi' bukanlah sesuatu yang Anda lakukan "setelah" koneksi, tetapi Anda harus "mencari di tempat yang tepat" ketika Anda benar-benar mencoba untuk mengautentikasi.

Kita dapat memulainya dengan mengikuti proses yang diuraikan dalam Aktifkan Auth dari dokumentasi inti, tetapi secara khusus diubah karena Anda ingin menjalankan "pengujian" ini di bawah akun pengguna dan direktori lokal Anda sendiri.

Langkah Revisi - Langsung dari Dokumentasi

Jadi pertama-tama ingin memilih direktori kerja lokal dan membuat jalur untuk file penyimpanan database di bawahnya. Pada sistem berbasis *nix Anda dapat melakukan sesuatu seperti:

mkdir -p scratch/data/db
cd scratch

Kemudian kami ingin memulai instance MongoDB terpisah tanpa opsi lain. Memastikan port tidak bertentangan dengan instance lain yang sedang berjalan:

mongod --port 37017 --dbpath data/db

Di terminal baru atau jendela baris perintah, Anda kemudian dapat terhubung ke shell:

mongo --port 37017

Anda selalu ingin setidaknya satu akun dengan hak administratif untuk setidaknya "membuat akun" dan mengubahnya jika Anda mendapat masalah, jadi buatlah satu:

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

Sekarang keluar dari shell dan tutup mongod yang ada instance berjalan di terminal lain atau command prompt dan kemudian mulai lagi menggunakan --auth :

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

Pengguna Tertentu - Pastikan Anda mengikuti ini

Sekarang Anda sebenarnya ingin membuat pengguna yang akan "digunakan oleh aplikasi Anda". Jadi, langkah-langkah ini penting untuk memastikan Anda melakukannya dengan benar.

Masuk ke shell menggunakan "pengguna administratif" Anda:

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

Anda dapat melakukan db.auth() . secara bergantian metode seperti yang ditunjukkan dalam pertanyaan, tetapi seperti yang dicatat ini harus diotorisasi pada "admin" ruang nama.

Hal berikutnya yang ingin Anda lakukan adalah membuat pengguna dengan akses ke "mydb" sebagai namespace dengan readWrite peran. Sebagai permulaan, kami juga akan membiarkan pengguna ini memiliki readAnyDatabase memungkinkan mereka untuk "mendaftar" semua ruang nama database, jika tidak benar-benar dapat melakukan hal lain dengan mereka.

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

Sekedar output tambahan, mari kita lihat pengguna yang dibuat saat ini:

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

Lihat bagaimana ini berkembang dalam penamaan, dan khususnya nilai yang ditetapkan ke berbagai "db" kunci pada setiap pengguna. Ini akan memberi Anda sedikit lebih banyak wawasan tentang bagaimana MongoDB mencari ini dan mengapa.

Koneksi Python

Akhirnya kami hanya ingin terhubung dari python. Jadi anggap Anda sudah menginstal python dan pymongo, maka itu hanya daftar sederhana untuk memverifikasi:

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)

Yang menunjukkan dokumen yang dibuat dan terdaftar tanpa masalah:

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

Perhatikan bahwa kita sebenarnya tidak perlu menyebutkan "admin" di sini, karena ini adalah default di mana pengemudi "mengharapkan akun" dan di mana Anda benar-benar "seharusnya" melakukannya.

Tapi saya melakukannya dengan cara yang salah

Jadi katakanlah Anda awalnya bingung dan membuat pengguna di bawah "mydb" sebagai gantinya:

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

Jika Anda pergi melihat di "admin" pengguna itu tidak ada. Tetapi jika Anda melihat "mydb" :

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

Jadi Anda dapat melihat di mana data pengguna yang sebenarnya sekarang disimpan dan bagaimana data tersebut telah direkam.

Kasus sederhana di sini adalah Anda "harus" memberi tahu MongoDB dari mana mendapatkan otentikasi untuk pengguna ini:

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

Lihat bagaimana kami menambahkan "mydb" ke string koneksi. Beginilah caranya.

Ini sebenarnya "sedang berlangsung" untuk dibuat konsisten dengan SEMUA driver dalam cara koneksi dibuat dan di mana otentikasi terjadi serta di mana Anda memilih database. Tapi ada aturan dasarnya:

  1. Jika tidak ada ruang nama database lain yang disediakan dengan detail koneksi untuk kredensial otentikasi, maka "admin" dianggap sebagai default .

  2. Jika ada ruang nama basis data yang disediakan pada string koneksi, ini akan digunakan untuk autentikasi dan ini adalah maksud sebenarnya dari namespace database pada string koneksi.

  3. Meskipun driver lain "saat ini" berbeda dalam peran namespace database pada string koneksi, penggunaannya diubah agar konsisten dengan semua driver yang "menggunakan" namespace database sebenarnya adalah panggilan API, daripada ditugaskan dari string koneksi.

Jadi di mana Anda perlu mengautentikasi tergantung pada "di mana Anda membuat pengguna". Tetapi Anda harus benar-benar memperhatikan bahwa "admin" adalah tempat di mana Anda "seharusnya" melakukan ini daripada di tempat lain.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara melakukan pemilihan bidang pada find() di driver asli mongodb?

  2. Mongodb $push dalam array bersarang

  3. luwak:mengisi luwak yang tidak memiliki ObjectId

  4. Perbedaan kinerja Mongodb antara indeks Hash dan Ascending (Ada alasan untuk tidak menggunakan hash di bidang yang tidak diurutkan?)

  5. Menguraikan kesalahan saat menyambung ke instance mongo yang dihosting di <project>.meteor.com