>
설명 :

Symfony 응용 프로그램에서 mongo 컬렉션을 삭제하려고하는데 컬렉션을 삭제하려고하면 "인증 실패"가 표시됩니다.데이터베이스를 선택하고컬렉션을 선택할 수 있습니다.

MongoService에 삽입 한 mongoUrl 연결 문자열은 내 docker compose에 지정된 것과 동일한 자격 증명을 사용합니다.

mongodb://root:[email protected]_mongo_1:27017

참고 : 잘못된 자격 증명을 입력해도 오류가 발생하지 않고 데이터베이스와 컬렉션을 선택할 수 있습니다.

질문 :

루트 자격 증명을 사용할 때 컬렉션을 삭제하려고하면 "인증 실패"가 발생하는 이유는 무엇입니까? 루트 사용자 이름과 비밀번호로 올바르게 인증하는 방법은 무엇입니까?

오류 :

[2018-06-21 08:45:41] request.CRITICAL: Uncaught PHP Exception MongoDB\Driver\Exception\AuthenticationException: "Authentication failed." at /var/www/redaph/vendor/mongodb/mongodb/src/Operation/DropCollection.php line 108 {"exception":"[object] (MongoDB\Driver\Exception\AuthenticationException(code: 11): Authentication failed. at /var/www/redaph/vendor/mongodb/mongodb/src/Operation/DropCollection.php:108)"} []

관련 코드 :

docker-compose.yml 스 니펫

version '3':
  services:
    mongo:
      image: mongo
      restart: always
      environment:
        MONGO_INITDB_ROOT_USERNAME: root
        MONGO_INITDB_ROOT_PASSWORD: "XXX"
      volumes:
        - mdb_data:/data/db

MongoService.php 스 니펫 :

class MongoService
{
    const QUESTION_RESPONSE_COLLECTION = "question_response";
    const DATABASE_NAME = "redaph";
    private $mongoDB;
    public function __construct($mongoUrl)
    {
        $mongoClient = new MongoClient($mongoUrl);
        $this->mongoDB = $mongoClient->selectDatabase(self::DATABASE_NAME);
    }
    private function getQuestionResponseCollection(){
        return $this->mongoDB->selectCollection(self::QUESTION_RESPONSE_COLLECTION);
    }

    public function generateQuestionResponses(){
        /** code here to populate $questionResponses **/
        $collection = $this->getQuestionResponseCollection();
        #-> Authentication Fails Here
        $collection->drop();
        $results = $collection->insertMany($questionResponses);
        return $results->getInsertedCount();
    }
    public function getQuestionResponses(){
        return $this->getQuestionResponseCollection()->find([]);
    }
}

  • 답변 # 1

    이 문제를 철저히 조사한 후 MongoService의 작동 방식을 변경하고 몽고 볼륨을 비 웠습니다.

    주된 문제는 컨테이너를 만든 후 얼마 전에 비밀번호를 변경했다는 것입니다.

    MongoService.php

    class MongoService
    {
        const QUESTION_RESPONSE_COLLECTION = "question_response";
        const DATABASE_NAME = "redaph";
        private $mongoDB;
        public function __construct($mongoUrl, $mongoUsername, $mongoPassword)
        {
            $mongoClient = new MongoClient($mongoUrl, ["authMechanism" => "SCRAM-SHA-1", "username" => $mongoUsername, "password" => $mongoPassword]);
            $this->mongoDB = $mongoClient->selectDatabase(self::DATABASE_NAME);
        }
    }
    
    

    services.yml

    parameters:
        locale: 'en'
        env(MONGO_URL): 'mongodb://127.0.0.1:27107'
        env(MONGO_USERNAME): ''
        env(MONGO_PASSWORD): ''
    services:
        App\Service\MongoService:
            arguments:
                $mongoUrl: '%env(resolve:MONGO_URL)%'
                $mongoUsername: '%env(resolve:MONGO_USERNAME)%'
                $mongoPassword: '%env(resolve:MONGO_PASSWORD)%'
    
    

관련 자료

  • 이전 swift - 물리 모양이 접촉 할 때 개체 모양과 일치하지 않습니다
  • 다음 스칼라 케이스 클래스, 생성자에서 매개 변수 수정