복붙노트

[MONGODB] 데이터베이스를 따기 후 인증합니다

MONGODB

데이터베이스를 따기 후 인증합니다

내 MongoDB의 서버 3 개 데이터베이스를 가지고있다. 나는 Python3 일부 스크립팅을 할 pymongo을 사용하고 있습니다.

나는 최신 버전과 관행을 사용하고 싶습니다. 나는 클라이언트를 열고 데이터베이스를 선택하면, pymongo.MongoClient. '하여 MyDatabase']. 인증합니다에 대한 API는 사용되지 않습니다. https://api.mongodb.com/python/current/api/pymongo/database.html

인증 (클라이언트를 거는 동안) 데이터베이스를 따기 전에 데이터베이스으로 흘러하지 않는 것 같습니다. 다만 pymongo에 대한뿐만 아니라, 나는 몽고 쉘을 사용하는 경우. 나는 기분이 그래서 이것이 문제입니다.

script.py

import pymongo
from pymongo import MongoClient
u = getUser()         # function which prompts for username
p = getPassword()     # getpass.getpass('Password')
uri = formatUri(u, p) # formats 'mongodb://%s:%s@%s'.format(user, password, host)

client = MongoClient(uri)
db = client['mydb']
col = db.mycollection
for doc in col.find():
    print(doc)

나는 데이터베이스에 대한 권한이 없습니다하고 있다는 오류가 발생합니다. 내 계정 쉘에서 작동 알고 있지만 내가 먼저 클라이언트를 다이얼 DB를 사용하고 정식해야합니다.

다음은 몽고 쉘의 예는 다음과 같습니다

$ mongo
MongoDB shell version: v3.4.10
Connecting to: mongodb://127.0.0.1:port
MongoDB server version: v3.4.10
> use mydb
switched to mydb
> db.auth("user", "pass")
1

내가이 상황에 맞는 내가 함께 전화를 걸 기억하고 DB를를 사용하면 나도 데이터베이스 또는 따기 후 정식하는 방법에 어떤 생각?

해결법

  1. ==============================

    1.당신은 기본적으로 내가 대신 일을해야하는지에 "가이드"로 답변 해 드리겠습니다, 그래서 여기에 몇 가지 개념을 누락 될 것으로 보인다. 그래서 이후에 "인증은 '당신이 정말 일이 아니다" "연결이 아니라 당신이 할 필요가"당신이 실제로 인증하려고하면 "바로 이곳에서 찾고.

    당신은 기본적으로 내가 대신 일을해야하는지에 "가이드"로 답변 해 드리겠습니다, 그래서 여기에 몇 가지 개념을 누락 될 것으로 보인다. 그래서 이후에 "인증은 '당신이 정말 일이 아니다" "연결이 아니라 당신이 할 필요가"당신이 실제로 인증하려고하면 "바로 이곳에서 찾고.

    우리는 기본적으로 핵심 문서에서 인증을 사용하도록 설정에 설명 된 절차에 따라이 시작,하지만 당신은 자신의 사용자 계정과 로컬 디렉토리에서이 "테스트"를 실행하려는 때문에 특별히 변경할 수 있습니다.

    그래서 일단 로컬 작업 디렉토리를 선택하고 그 아래에있는 데이터베이스에 저장 한 파일의 경로를 만들고 싶어 할 것이다. * nix에서 스크립트 기반 시스템에서 당신이 뭔가를 같이 할 수 있습니다 :

    mkdir -p scratch/data/db
    cd scratch
    

    그럼 우리는 다른 옵션없이 별도의 MongoDB의 인스턴스를 시동하고 싶다. 확인하는 포트 않는 다른 실행중인 인스턴스와 충돌하지 :

    mongod --port 37017 --dbpath data/db
    

    새 터미널 또는 명령 줄 창에서 다음 쉘에 연결할 수 있습니다 :

    mongo --port 37017
    

    당신은 항상 적어도 "계정을 생성"당신은 그래서 하나를 만들어, 문제가 얻을 경우이를 변경하려면 관리자 권한을 가진 계정을 하나합니다 :

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

    이제 다른 단말기에서 실행되는 쉘과 가까운 기존의 mongod 인스턴스를 종료하거나 명령 프롬프트 다음 --auth 사용하여 다시 시작 :

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

    지금 당신은 실제로 "응용 프로그램에서 사용하는"것이다 사용자를 만들려고합니다. 이 단계를 확인하는 것이 중요합니다 그래서 당신은 그것을 제대로.

    당신의 "관리 사용자"를 사용하여 쉘에 로그인 :

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

    질문에 표시하지만, 언급 한 바와 같이이이 "관리자"네임 스페이스에 권한이 있어야합니다 같이 교대로 db.auth () 메소드를 할 수 있습니다.

    당신이 원하는 그 다음 일은 READWRITE 역할 네임 스페이스로 "MYDB"에 액세스 할 수있는 사용자를 생성합니다. 차기를 들어, 우리는 또한 실제로 그들과 함께 다른 작업을 수행 할 수없는 경우,이 사용자가 readAnyDatabase 모든 데이터베이스 네임 스페이스 "목록"에 허용해야 할 것입니다.

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

    그냥 추가 출력을 위해, 현재 생성 된 사용자에 살펴 보자 :

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

    이러한 이름에 확대하는 방법을 참조하고, 각 사용자에 대한 다양한 "DB"키에 할당 특히 값. 이렇게하면 MongoDB를이 최대 이유를 보는 방법에 좀 더 통찰력을 제공한다.

    마지막으로 우리는 파이썬에서 연결하려는. 당신은 파이썬이 이미 설치 pymongo 추정 그래서, 그것은 확인 목록 그냥 간단합니다 :

    import pymongo
    from pymongo import MongoClient
    client = MongoClient('mongodb://myuser:password@localhost:37017');
    
    db = client['mydb']
    col = db.test
    
    col.remove()
    
    col.insert_one({ "a": 1 })
    
    for doc in col.find():
      print(doc)
    

    어떤 쇼 문제없이 생성 나열된 문서 :

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

    이 드라이버는 당신이 정말로 그 일을 할 "해야"어디에 "계정이있을 것으로 기대"기본이기 때문에 우리가 실제로 여기에 "관리자"에 대한 언급을 할 필요는 없습니다.

    그럼 원래 모든 혼란있어 대신 "MYDB"에서 사용자가 만든 가정 해 봅시다 :

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

    당신은 사용자가 없는지 "관리자"에서 살펴 이동합니다. 하지만 당신은 "MYDB"에 보면 :

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

    실제 사용자 데이터가 현재 유지되고 그것이 어떻게 기록 된 위치를 볼 수 있습니다.

    여기에 간단한 케이스 어디이 사용자로부터 인증을 획득하는 MongoDB를에게 "해야한다"입니다 :

    client = MongoClient('mongodb://bert:password@localhost:37017/mydb');
    

    우리는 연결 문자열에 "MYDB"를 추가하는 방법을 참조하십시오. 이것은 한 방법이다.

    이 연결이 이루어 및 인증뿐만 아니라 데이터베이스를 선택한 경우와 같은 일이 어디 방법의 모든 드라이버와 일치하게 될 "진행"사실이다. 그러나 기본 규칙이 있습니다 :

    당신이 인증 할 필요가 어디 그래서 "당신이 사용자를 만든 곳"에 따라 달라집니다. 하지만 당신은 정말 "admin"을 지적해야하는 것은 다른 곳에서는 대신이 일을해야 "한다"장소입니다.

  2. from https://stackoverflow.com/questions/47253584/authenticate-after-picking-the-database by cc-by-sa and MIT license