4

I'm writing a spring boot web server which connects to a MongoDB (that runs in Docker). The connection seems to work but when I want to use operations on the DB I fail to connect due to an authentication error (code 18). I don't know why since when I access the DB via shell it works.

Application file

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.username=rootuser
spring.data.mongodb.password=rootpass
spring.data.mongodb.database=databaseBA
spring.data.mongodb.port=27017
spring.data.mongodb.host=localhost

Docker Compose file (.yaml)

version: "3.8"
services:
  mongodb:
    image: mongo
    container_name: mongodb
    ports:
      - 27017:27017
    volumes:
      - data:/data
    environment:
      - MONGO_INITDB_ROOT_USERNAME=rootuser
      - MONGO_INITDB_ROOT_PASSWORD=rootpass
  mongo-express:
    image: mongo-express
    container_name: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=rootuser
      - ME_CONFIG_MONGODB_ADMINPASSWORD=rootpass
      - ME_CONFIG_MONGODB_SERVER=mongodb
volumes:
  data: {}
networks:
  default:
    name: mongodb_network

Main Class

@SpringBootApplication
public class ServerApplication {

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


    @Bean
    CommandLineRunner runner(ParticipantRepository repository){
        return args -> {
            Participant participant = new Participant(
                    "token",
                    Gender.MALE,
                    StudyCourse.BIOPHYSICS
            );

            repository.insert(participant);
        };
    }
}

Error Message

2021-11-05 21:45:22.995  INFO 15700 --- [           main] o.s.s.web.DefaultSecurityFilterChain     : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@b46e103, org.springframework.security.web.context.SecurityContextPersistenceFilter@6a9cd0f8, org.springframework.security.web.header.HeaderWriterFilter@6d8796c1, org.springframework.security.web.csrf.CsrfFilter@53c1179a, org.springframework.security.web.authentication.logout.LogoutFilter@6a1d6ef2, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7be2f29a, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@77dba4cd, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2b0e9f30, org.springframework.security.web.session.SessionManagementFilter@3df1a1ac, org.springframework.security.web.access.ExceptionTranslationFilter@3382cf68, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@6198e9b5]
2021-11-05 21:45:23.110  INFO 15700 --- [           main] org.mongodb.driver.cluster               : Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms'}
2021-11-05 21:45:23.178  INFO 15700 --- [localhost:27017] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:2, serverValue:146}] to localhost:27017
2021-11-05 21:45:23.178  INFO 15700 --- [localhost:27017] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:1, serverValue:147}] to localhost:27017
2021-11-05 21:45:23.180  INFO 15700 --- [localhost:27017] org.mongodb.driver.cluster               : Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=STANDALONE, state=CONNECTED, ok=true, minWireVersion=0, maxWireVersion=13, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=23309600}
2021-11-05 21:45:23.725  INFO 15700 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-11-05 21:45:23.735  INFO 15700 --- [           main] s.d.s.application.ServerApplication      : Started ServerApplication in 3.595 seconds (JVM running for 4.214)
2021-11-05 21:45:23.838  INFO 15700 --- [           main] org.mongodb.driver.connection            : Closed connection [connectionId{localValue:3}] to localhost:27017 because there was a socket exception raised by this connection.
2021-11-05 21:45:23.845  INFO 15700 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-11-05 21:45:23.870 ERROR 15700 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:794) ~[spring-boot-2.5.6.jar:2.5.6]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:775) ~[spring-boot-2.5.6.jar:2.5.6]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:345) ~[spring-boot-2.5.6.jar:2.5.6]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.6.jar:2.5.6]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.6.jar:2.5.6]
    at stachm.dbisbavlasjuk.server.application.ServerApplication.main(ServerApplication.java:16) ~[classes/:na]
Caused by: org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='rootuser', source='admin', password=<hidden>, mechanismProperties=<hidden>}; nested exception is com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='rootuser', source='admin', password=<hidden>, mechanismProperties=<hidden>}
    at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:140) ~[spring-data-mongodb-3.2.6.jar:3.2.6]
    at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2899) ~[spring-data-mongodb-3.2.6.jar:3.2.6]
    at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:555) ~[spring-data-mongodb-3.2.6.jar:3.2.6]
    at org.springframework.data.mongodb.core.MongoTemplate.insertDocument(MongoTemplate.java:1458) ~[spring-data-mongodb-3.2.6.jar:3.2.6]
    at org.springframework.data.mongodb.core.MongoTemplate.doInsert(MongoTemplate.java:1257) ~[spring-data-mongodb-3.2.6.jar:3.2.6]
    at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:1172) ~[spring-data-mongodb-3.2.6.jar:3.2.6]
    at org.springframework.data.mongodb.repository.support.SimpleMongoRepository.insert(SimpleMongoRepository.java:283) ~[spring-data-mongodb-3.2.6.jar:3.2.6]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) ~[spring-data-commons-2.5.6.jar:2.5.6]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.5.6.jar:2.5.6]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.5.6.jar:2.5.6]
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:529) ~[spring-data-commons-2.5.6.jar:2.5.6]
    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-2.5.6.jar:2.5.6]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:599) ~[spring-data-commons-2.5.6.jar:2.5.6]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.12.jar:5.3.12]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:163) ~[spring-data-commons-2.5.6.jar:2.5.6]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.5.6.jar:2.5.6]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.12.jar:5.3.12]
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.5.6.jar:2.5.6]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.12.jar:5.3.12]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.12.jar:5.3.12]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.12.jar:5.3.12]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.12.jar:5.3.12]
    at com.sun.proxy.$Proxy71.insert(Unknown Source) ~[na:na]
    at stachm.dbisbavlasjuk.server.application.ServerApplication.lambda$runner$0(ServerApplication.java:29) ~[classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:791) ~[spring-boot-2.5.6.jar:2.5.6]
    ... 5 common frames omitted
Caused by: com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='rootuser', source='admin', password=<hidden>, mechanismProperties=<hidden>}
    at com.mongodb.internal.connection.SaslAuthenticator.wrapException(SaslAuthenticator.java:271) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.SaslAuthenticator.getNextSaslResponse(SaslAuthenticator.java:136) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.SaslAuthenticator.access$100(SaslAuthenticator.java:47) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:62) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:56) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.SaslAuthenticator.doAsSubject(SaslAuthenticator.java:278) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:56) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:53) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnectionInitializer.authenticate(InternalStreamConnectionInitializer.java:168) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:63) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:144) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.UsageTrackingInternalConnection.open(UsageTrackingInternalConnection.java:51) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.open(DefaultConnectionPool.java:431) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:115) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:100) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.DefaultServer.getConnection(DefaultServer.java:96) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.binding.ClusterBinding$ClusterBindingConnectionSource.getConnection(ClusterBinding.java:123) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.client.internal.ClientSessionBinding$SessionBindingConnectionSource.getConnection(ClientSessionBinding.java:135) ~[mongodb-driver-sync-4.2.3.jar:na]
    at com.mongodb.internal.operation.OperationHelper.withReleasableConnection(OperationHelper.java:621) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:185) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:76) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:187) ~[mongodb-driver-sync-4.2.3.jar:na]
    at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:1009) ~[mongodb-driver-sync-4.2.3.jar:na]
    at com.mongodb.client.internal.MongoCollectionImpl.executeInsertOne(MongoCollectionImpl.java:470) ~[mongodb-driver-sync-4.2.3.jar:na]
    at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:453) ~[mongodb-driver-sync-4.2.3.jar:na]
    at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:447) ~[mongodb-driver-sync-4.2.3.jar:na]
    at org.springframework.data.mongodb.core.MongoTemplate.lambda$insertDocument$16(MongoTemplate.java:1464) ~[spring-data-mongodb-3.2.6.jar:3.2.6]
    at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:553) ~[spring-data-mongodb-3.2.6.jar:3.2.6]
    ... 31 common frames omitted
Caused by: com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017. The full response is {"ok": 0.0, "errmsg": "Authentication failed.", "code": 18, "codeName": "AuthenticationFailed"}
    at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:175) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:358) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:279) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:83) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:33) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:227) ~[mongodb-driver-core-4.2.3.jar:na]
    at com.mongodb.internal.connection.SaslAuthenticator.getNextSaslResponse(SaslAuthenticator.java:134) ~[mongodb-driver-core-4.2.3.jar:na]
    ... 57 common frames omitted

2021-11-05 21:45:24.344  INFO 15700 --- [           main] org.mongodb.driver.connection            : Closed connection [connectionId{localValue:4}] to localhost:27017 because there was a socket exception raised by this connection.

Process finished with exit code 1

So as you can see I try to add a document into the database via the command line runner-bean to test if I can use my db correctly. You can also see in the error message that the source and username should be correct but why does the password not match then. The Spring-Boot version is 2.5.6, jdk 11, MongoDB 5.0.3. (If I use mongo admin -u rootuser -p 'rootpass' on the shell it works...) If it's important I also show my model for the database:

Participant

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Getter
@Setter
@ToString
@Document("participant")
public class Participant {
    @Id
    private String subjectPseudonym;

    private String tokenID;
    private Gender gender;
    private StudyCourse studyCourse;

    public Participant(String tokenID, Gender gender, StudyCourse studyCourse) {
        this.tokenID = tokenID;
        this.gender = gender;
        this.studyCourse = studyCourse;
    }
}

Gender

public enum Gender {
    MALE, FEMALE, OTHER;
}

Courses (some German)

public enum StudyCourse {
    COGNITIVE_SYSTEMS,
    COMMUNICATION_AND_INFORMATION_TECHNOLOGY,
    ELEKTROTECHNIK,
    INFORMATIK,
    INFORMATIONSSYSTEMTECHNIK,
    KUENSTLICHE_INTELLIGENZ,
    LEHRAMT_GYMNASIUM,
    MEDIENINFORMATIK,
    PSYCHOLOGIE,
    SENSORSYSTEMTECHNIK,
    SOFTWARE_ENGINEERING,
    AKTUARWISSENSCHAFTEN,
    BUSINESS_ANALYTICS,
    COMPUTATIONAL_SCIENCE_AND_ENGINEERING,
    FINANCE,
    MATHEMATICAL_DATA_SCIENCE,
    MATHEMATIK,
    MATHEMATISCHE_BIOMETRIE,
    NACHHALTIGE_UNTERNEHMUNGSFUEHRUNG,
    WIRTSCHAFTSMATHEMATIK,
    WIRTSCHAFTSWISSENSCHAFTEN,
    ADVANCED_ONCOLOGY,
    HUMANMEDIZIN,
    MOLECULAR_AND_TRANSLATIONAL_NEUROSCIENCES,
    MOLEKULARE_MEDIZIN,
    ZAHNMEDIZIN,
    ADVANCED_MATERIALS,
    BIOCHEMIE,
    BIOLOGIE,
    BIOPHYSICS,
    CHEMICAL_ENGINEERING,
    CHEMIE,
    CHEMIEINGENIEURWESEN,
    ENERGY_SCIENCE_AND_TECHNOLOGY,
    INDUSTRIELLE_BIOTECHNOLOGIE,
    PHARMAZEUTISCHE_BIOTECHNOLOGY,
    PHYSIK,
    WIRTSCHAFTSCHEMIE,
    WIRTSCHAFTSPHYSIK,
    ANDERES
}

Repository

import org.springframework.data.mongodb.repository.MongoRepository;

public interface ParticipantRepository extends MongoRepository<Participant, String> {
}

M.Mavini
  • 589
  • 8
  • 20
  • Please read: [Why not upload images of code/errors when asking a question?](https://meta.stackoverflow.com/questions/285551/why-not-upload-images-of-code-errors-when-asking-a-question) – Turing85 Nov 05 '21 at 20:40
  • @Turing85 sry my bad i will avoid it in the future (I will edit it now) – Anton Vlasjuk Nov 05 '21 at 20:43
  • I hit a similar issue, this might help https://stackoverflow.com/questions/71729732/authentication-failed-connecting-to-mongodb-running-in-a-local-docker-cointainer/71757854#71757854 – eHayik Apr 05 '22 at 20:16

1 Answers1

0

I got the exact same error with an equal setup. Only difference was, that I used newer versions: Spring Boot 3.1.0, Mongo DB 6.0.6 and Java 17.

The MongoDB Docker container showed an authentication error, saying that user "root" could not be found in authentication database "databaseBA".

I'm not sure why it tried to use database "databaseBA" for authentication, seen that property spring.data.mongodb.authentication-database=admin indicates that we want to use database admin for authentication.

It started working when I used an URI instead of single properties in the application.properties file. I didn't change anything else in the setup.

With the data from your question, the URI would look like this:

spring.data.mongodb.uri=mongodb://rootuser:rootpass@127.0.0.1:27017/databaseBA?authSource=admin
Sky
  • 674
  • 8
  • 22