[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.당신은 기본적으로 내가 대신 일을해야하는지에 "가이드"로 답변 해 드리겠습니다, 그래서 여기에 몇 가지 개념을 누락 될 것으로 보인다. 그래서 이후에 "인증은 '당신이 정말 일이 아니다" "연결이 아니라 당신이 할 필요가"당신이 실제로 인증하려고하면 "바로 이곳에서 찾고.
당신은 기본적으로 내가 대신 일을해야하는지에 "가이드"로 답변 해 드리겠습니다, 그래서 여기에 몇 가지 개념을 누락 될 것으로 보인다. 그래서 이후에 "인증은 '당신이 정말 일이 아니다" "연결이 아니라 당신이 할 필요가"당신이 실제로 인증하려고하면 "바로 이곳에서 찾고.
우리는 기본적으로 핵심 문서에서 인증을 사용하도록 설정에 설명 된 절차에 따라이 시작,하지만 당신은 자신의 사용자 계정과 로컬 디렉토리에서이 "테스트"를 실행하려는 때문에 특별히 변경할 수 있습니다.
그래서 일단 로컬 작업 디렉토리를 선택하고 그 아래에있는 데이터베이스에 저장 한 파일의 경로를 만들고 싶어 할 것이다. * 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"을 지적해야하는 것은 다른 곳에서는 대신이 일을해야 "한다"장소입니다.
from https://stackoverflow.com/questions/47253584/authenticate-after-picking-the-database by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를 집계 파이프 라인 느린 첫 경기의 단계 이후 (0) | 2019.12.07 |
---|---|
[MONGODB] $ 조회 집계 필드를 제외 (0) | 2019.12.07 |
[MONGODB] 모든 문서의 배열의 단지 중첩 된 문서를 반환하는 방법 (0) | 2019.12.07 |
[MONGODB] 통합 후 원본 문서 등을 다시 얻는 방법 (0) | 2019.12.07 |
[MONGODB] 몽구스 (또는 MongoDB를)에서 TransientTransactionError은 무엇인가? (0) | 2019.12.07 |