programing

Spring Boot 앱을 통해 mongodb에 액세스할 때 인증 오류 발생

skycolor 2023. 7. 1. 08:15
반응형

Spring Boot 앱을 통해 mongodb에 액세스할 때 인증 오류 발생

Java 스프링 부팅 응용 프로그램에서 원격 mongodb에 연결하는 데 문제가 있습니다.MongoDB 서버에 방화벽이 설정되어 있지 않고 다른 컴퓨터에서 원격으로 mongo에 연결할 수 있습니다.컬렉션과 사용자가 설정된 데이터베이스가 있습니다.사용자 자격 증명을 사용하여 Java 앱에서 데이터베이스에 연결하려고 하면 다음과 같은 예외가 발생합니다.

com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='sokrates', source='homeControl', password=<hidden>, mechanismProperties={}}
at com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:61) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:32) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:99) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:44) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:128) ~[mongodb-driver-core-3.2.2.jar:na]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_92]
Caused by: com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server localhost:27017. The full response is { "ok" : 0.0, "code" : 18, "errmsg" : "Authentication failed." }
at com.mongodb.connection.CommandHelper.createCommandFailureException(CommandHelper.java:170) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.CommandHelper.receiveCommandResult(CommandHelper.java:123) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:32) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:95) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:45) ~[mongodb-driver-core-3.2.2.jar:na]
... 6 common frames omitted

동일한 코드를 사용하여 동일한 설정, 데이터베이스, 컬렉션 및 사용자로 로컬 MongoDB에 연결하면 모든 것이 정상입니다.

mongo 설치에서 admin 사용자를 설정하는 데 약간의 문제가 있었습니다.또한 로컬 mongo는 OSX에서 실행되는 반면 프로덕션 mongo(인증 실패)는 Ubuntu Server 16.04에서 실행됩니다.저는 이틀 동안 다른 MongoDB 인증 스레드를 조사했지만, 아무도 이 문제를 해결하지 못했습니다.이것에 대한 어떤 도움도 감사합니다 :-)

감사해요.

스테판

문제를 발견했습니다.이 스레드의 완성도를 위해 코드를 포함한 답을 공유하겠습니다.문제는 애플리케이션 속성 spring.data.mongodb.uri를 잘못 사용했다는 것입니다. 사용자 이름과 암호가 URI에 없습니다. spring.data.mongodb.username과 spring.data.mongodb.password가 이를 포함한다고 잘못 믿었기 때문입니다.따라서 uri를 사용자 이름 및 암호와 함께 사용하거나 호스트 및 데이터베이스(및 포트) 스프링 속성을 명시적으로 사용합니다.여기 코드가 있습니다.mongoDB를 지원하는 스프링 부트 앱에서 작동할 것입니다(초기화자 또는 IntelliJ를 사용하여 해당 프로젝트를 만듭니다).모델이 있습니다.

package net.IndyStef.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "person")
public class Person {

@Id
private String id;

private String name;
private Integer age;

public Person() {
}

public Person(String id) {
    this.id = id;
}

public Person(String id, String name, Integer age) {
    this.id = id;
    this.name = name;
    this.age = age;
}

... getters/setters omitted for breverity ...
}

데이터는 저장소를 통해 읽고 씁니다.

package net.IndyStef.repository;

import net.okrongli.model.Person;
import org.springframework.data.mongodb.repository.MongoRepository;

/**
 * Created by IndyStef on 23/08/16.
 */
public interface PersonRepository extends MongoRepository<Person, String> {
}

데이터베이스 이름, 호스트 및 자격 증명은 application.properties 파일에 있습니다.

spring.data.mongodb.host=192.168.1.90
spring.data.mongodb.database=people
spring.data.mongodb.username=user
spring.data.mongodb.password=password
#spring.data.mongodb.uri=mongodb://192.168.1.90/people

중요한 것은 uri를 데이터베이스 및 사용자 이름과 함께 사용하지 않는 것입니다.uri를 사용하는 경우 다음과 같이 사용자 이름과 암호를 포함해야 합니다.

spring.data.mongodb.uri=mongodb://user:password@192.168.1.90/people

이를 테스트하기 위해 간단한 Spring 명령줄 러너를 사용했습니다.

package net.IndyStef;

import net.IndyStef.model.Person;
import net.IndyStef.repository.PersonRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.List;

@SpringBootApplication
public class MongoDbTestApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(MongoDbTestApplication.class, args);
    }

    @Autowired
    private PersonRepository repository;

    @Override
    public void run(String... args) {

        repository.save(new Person("peter.pan", "Peter Pan", 865));

        List<Person> people = repository.findAll();

        for (Person person: people) {
            System.out.println(person);
        }
    }
}

나는 이 설명이 며칠 동안 나처럼 그것을 이해하지 못한 다른 사람들에게 도움이 되기를 바랍니다.

감사해요.

스테판

Spring Boot 1.5.15 기준으로 다음 행을 추가할 수 있습니다.application.properties파일 이름:

spring.data.mongodb.uri=mongodb://username:password@localhost:27017/?authSource=admin&authMechanism=SCRAM-SHA-1
spring.data.mongodb.database=mycollection

이것이 그 당시에 저에게 효과가 있었던 것입니다.

spring.data.mongodb.uri=mongodb://user:password@******.mongodb.net:27017/dbname?ssl=true&authSource=admin&authMechanism=SCRAM-SHA-1

추가해야 했습니다.ssl=true그렇지 않으면 오류가 발생했습니다.

com.mongodb.MongoSocketReadException: 스트림 끝에 너무 일찍 도달했습니다.

나의 경우, mongo 아틀라스에서 원격 mongodb로 스프링 앱을 실행하기 위해 미니큐브를 사용하고 있습니다.

configMaps & secret에서 부분적으로 연결되지 않도록 비밀에서 전체 uri를 찾게 됩니다.

부터

spring.data.mongodb.uri=${MONGODB_PREFIX_URL}://${MONGODB_COLLECTION_NAME}:${MONGODB_PASSWORD}@cluster0.kut8aym.mongodb.net/?retryWrites=true&w=majority

되기 위해

spring.data.mongodb.uri=${MONGODB_URI}

언급URL : https://stackoverflow.com/questions/39086471/authentication-error-when-accessing-mongodb-through-spring-boot-app

반응형