【问题标题】:PSQLException: The server requested password-based authentication, but no password was providedPSQLException:服务器请求基于密码的身份验证,但未提供密码
【发布时间】:2020-03-24 03:29:18
【问题描述】:

我有一个 Spring Boot 项目,我正在尝试连接到本地 PostgreSQL 数据库。正在从 DataSourceBuilder 实例化数据源。出于本示例的目的,我将数据库用户名、密码和数据库 URL 硬编码(它们将通过属性文件传入),这就是实现的样子:

String url = "jdbc:postgresql://localhost:5433/<TABLENAME>";

String username = <USERNAME>;
String password = <PASSWORD>;

return DataSourceBuilder
            .create()
            .driverClassName("org.postgresql.Driver")
            .url(url)
            .username(username)
            .password(password)
            .build();

当我运行 Spring Application main 方法时,抛出以下异常:

Caused by: org.postgresql.util.PSQLException: 
The server requested password-based authentication, but no password was provided.
at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:534)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:141)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:192)

我尝试使用sudo passwd postgres 更改postgres 用户密码几次,但这似乎不起作用。有什么想法吗?

【问题讨论】:

  • 你为什么不在你的属性中配置这些值并让自动配置为你做这些?

标签: java spring postgresql


【解决方案1】:

我的猜测是你没有在 Spring 容器中注入你的 bean,所以使用这样的东西:

@Bean
public DataSource dataSource() {
    String url = "jdbc:postgresql://localhost:5433/<DATABASE_NAME>";

    String username = <USERNAME>;
    String password = <PASSWORD>;

    return DataSourceBuilder
            .create()
            .driverClassName("org.postgresql.Driver")
            .url(url)
            .username(username)
            .password(password)
            .build();
}

顺便说一句,在您的 jdbcUrl 中,您需要使用 DatabaseName,而不是 TableName。

注意:我认为最好利用 Spring Boot 已经自动配置所有内容的方式,因此我建议您执行以下操作:

@Configuration
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public class DatabaseConfig extends HikariConfig {
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource(this);
    }
}

并使用以下属性:

spring.datasource.hikari.jdbcUrl=jdbc:postgresql://localhost:5433/blog
spring.datasource.hikari.username=user
spring.datasource.hikari.password=user
spring.datasource.hikari.driverClassName=org.postgresql.Driver

您可以在此处查看我的一个工作示例: https://github.com/vladucuvoican/simple-blog/blob/master/src/main/resources/application.properties

【讨论】:

    【解决方案2】:

    可能是bean扫描出现问题

    我有同样的问题,但日志没有显示。

    试试:

    @Configuration
    public class DataSourceConfig {
        @Value("${spring.datasource.driver-class-name}")
        private String driverClass;
        @Value("${spring.datasource.data-username}")
        private String url;
        @Value("${spring.datasource.data-username}")
        private String userName;
        @Value("${spring.datasource.data-password}")
        private String password;
    
        @Bean
        public DataSource getDataSource() {
            return DataSourceBuilder.create()
                    .driverClassName(driverClass)
                    .url(url)
                    .username(userName)
                    .password(password)
                    .build();
        }
    }
    

    如果您使用 SpringBoot,请使用 SpringBootApplication runner 移动到包或手动定义扫描

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      相关资源
      最近更新 更多