【问题标题】:Query failed with error code 13 and error message 'command find requires authentication' on server localhost:27017查询失败,错误代码 13 和服务器 localhost:27017 上的错误消息“命令查找需要身份验证”
【发布时间】:2020-07-09 16:25:27
【问题描述】:

我在使用 MongoDB 和 Spring Boot 时遇到了奇怪的错误。 我使用 Reactive MongoDb 库 (spring-boot-starter-data-mongodb-reactive) 。 当我将 url 放入 application.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]

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

你有什么想法吗? 请帮忙。

【问题讨论】:

    标签: java spring mongodb spring-boot reactive


    【解决方案1】:

    您应该指定authSource,如下所示

    mongodb://test01:test01@localhost/test_db?authSource=admin
    

    【讨论】:

    • 还是一样的例外。数据库名称是特定的 test_db。 Spring的文档说你可以在服务器或authSource之后有数据库名称
    • @Doanh 你能做到这一点吗?
    【解决方案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;
    }
    

    这应该会有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-11-26
      • 2018-12-26
      • 2020-01-04
      • 2019-09-02
      • 2015-12-14
      • 2018-09-03
      • 2022-01-10
      • 2019-07-20
      • 2011-05-25
      相关资源
      最近更新 更多