有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java查询失败,在服务器localhost:27017上出现错误代码13和错误消息“command find requires authentication”

MongoDB和Spring Boot出现了奇怪的错误。 我使用反应式MongoDb库(spring boot starter data MongoDb Reactive)。 当我把url放到应用程序中时,它工作得很好。yml文件

spring:
  data:
    mongodb:
      uri: mongodb://test01:test01@localhost/test_db

但当我将其移动到MongoConfig类中时,应用程序会抛出异常

@EnableReactiveMongoRepositories
public class MongoDBConfig  extends AbstractReactiveMongoConfiguration {
    @Bean
    public MongoClient mongoClient() {
        return MongoClients.create("mongodb://test01:test01@localhost/test_db?authMode=SCRAM-SHA-1");
    }

    @Override
    protected String getDatabaseName() {
        return "test_db";
    }
}

例外

Caused by: com.mongodb.MongoQueryException: Query failed with error code 13 and error message 'command find requires authentication' on server localhost:27017
    at com.mongodb.internal.operation.FindOperation$3.onResult(FindOperation.java:722) ~[mongodb-driver-core-4.0.4.jar:na]
    at com.mongodb.internal.operation.OperationHelper$ReferenceCountedReleasingWrappedCallback.onResult(OperationHelper.java:411) ~[mongodb-driver-core-4.0.4.jar:na]
    at com.mongodb.internal.operation.CommandOperationHelper$10.checkRetryableException(CommandOperationHelper.java:493) ~[mongodb-driver-core-4.0.4.jar:na]

在代码中使用时,连接字符串似乎不起作用

你知道吗? 请帮忙


共 (2) 个答案

  1. # 1 楼答案

    您应该指定authSource,如下所示

    mongodb://test01:test01@localhost/test_db?authSource=admin
    
  2. # 2 楼答案

    回答晚了,但以下几点对我有用

    @Configuration
    @EnableConfigurationProperties
    @ConfigurationProperties("spring.data.mongodb") // to access properties in application.yml file
    public class CustomMongoDBConfiguration extends AbstractMongoClientConfiguration {
    
    private String user;
    private String password;
    private String host;
    private String port;
    private String database;
    private String authSource;
    private String authMode;
    
    @Override
    protected String getDatabaseName() {
        return this.database;
    }
    
    @Override
    protected void configureClientSettings(MongoClientSettings.Builder builder) {
    
        builder
                .credential(MongoCredential.createCredential(this.user, this.database, this.password.toCharArray()))
                .applyToClusterSettings(settings  -> {
                    settings.hosts(Collections.singletonList(new ServerAddress(this.host, Integer.parseInt(this.port))));
    
                });
    }
    

    此类应该在调用存储库的服务中自动连接。见下文:

    public class UserServiceImpl implements UserService, UserDetailsService {
    
    private final CustomMongoDBConfiguration config;
    private final UserRepository userRepository;
    
    @Autowired(required = true)
    public UserServiceImpl(CustomMongoDBConfiguration config, UserRepository userRepository) {
        this.config = config;
        this.userRepository = userRepository;
    }
    

    这应该会有帮助