29

我最近尝试了 Postgres。将其安装在本地(PostgreSQL 13.0)上。创建了一个 Maven 项目并使用了 Spring Data JPA,工作得很好。而当我尝试使用 Gradle 项目时,我无法连接到数据库并不断收到以下错误。

org.postgresql.util.PSQLException:不支持身份验证类型 10。检查您是否已将 pg_hba.conf 文件配置为包含客户端的 IP 地址或子网,并且它正在使用驱动程序支持的身份验证方案。在 org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:614) ~[postgresql-42.1.4.jar:42.1.4] 在 org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java: 222) ~[postgresql-42.1.4.jar:42.1.4] 在 org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) ~[postgresql-42.1.4.jar:42.1.4] 在 org. postgresql.jdbc.PgConnection.(PgConnection.java:194) ~[postgresql-42.1.4.jar:42.1.4] at org.postgresql.Driver.makeConnection(Driver.java:450) ~[postgresql-42.1.4. jar:42.1.4] 在 org.postgresql.Driver。

我也尝试使用 JDBCTemplate。不工作

修改了参考这篇文章的 pg_hba.cfg 文件 - 不起作用

使用了已弃用的库 - 也不起作用。

请建议我解决此问题。

我的代码和配置:

    @Configuration
    public class DataSourceConfig {
    
        
        @Bean
        public DriverManagerDataSource getDataSource() {
            DriverManagerDataSource dataSourceBuilder = new DriverManagerDataSource();
            dataSourceBuilder.setDriverClassName("org.postgresql.Driver");
            dataSourceBuilder.setUrl("jdbc:postgresql://localhost:5432/postgres");
            dataSourceBuilder.setUsername("postgres");
            dataSourceBuilder.setPassword("root");
            return dataSourceBuilder;
        }
        
    }



@Component
public class CustomerOrderJDBCTemplate implements CustomerOrderDao{
    
    private DataSource dataSource;
    
    private JdbcTemplate jdbcTemplateObject;

    @Autowired
    ApplicationContext context;
    
    public void setDataSource() {
        //Getting Bean by Class
        DriverManagerDataSource dataSource = context.getBean(DriverManagerDataSource.class);
        this.dataSource = dataSource;
        this.jdbcTemplateObject = new JdbcTemplate(this.dataSource);
    }

@Override
    public Customer create(Customer customer) {
        setDataSource();
        String sql = "insert into CustomerOrder (customerType, customerPayment) values (?, ?)";
        //jdbcTemplateObject.update(sql, customerOrder.getCustomerOrderType(), customerOrder.getCustomerOrderPayment());
        
        KeyHolder holder = new GeneratedKeyHolder();
        jdbcTemplateObject.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
                ps.setString(1, customer.getType());
                ps.setString(2, customer.getPayment());
                return ps;
            }
        }, holder);

        long customerId = holder.getKey().longValue();
        customer.setCustomerID(customerOrderId);
        return customer;
        
    }

}

依赖关系

implementation('org.springframework.boot:spring-boot-starter-web')
    compile("org.springframework.boot:spring-boot-devtools")
    compile(group: 'org.postgresql', name: 'postgresql', version: '42.1.4')
    compile("org.springdoc:springdoc-openapi-ui:1.4.1")
    compile("org.springframework:spring-jdbc:5.2.5.RELEASE")

password_encryption设置如下:

postgres=# show password_encryption;
 password_encryption
---------------------
 scram-sha-256
(1 row)
4

11 回答 11

23

我通过在 PostgreSQL版本 13中应用以下步骤解决了类似的问题:

  1. 将 password_encryption 更改为 md5。

    文件:C:\Program Files\PostgreSQL\13\data\postgresql.conf

    在此处输入图像描述

  2. 在主机设置中更改scram-sha-256为。md5

    文件:C:\Program Files\PostgreSQL\13\data\pg_hba.conf

    托管所有所有 0.0.0.0/0 md5

    在此处输入图像描述

  3. 更改密码(此恢复密码为 md5 格式)。

    示例:ALTER ROLE postgres WITH PASSWORD 'root';

  4. listen_addresses = '*'如果您在非生产环境中工作,请确保设置。

    文件 :C:\Program Files\PostgreSQL\13\data\postgresql.conf

于 2020-10-13T13:37:15.100 回答
20

在目录 C:\Program Files\PostgreSQL\13\data\pg_hba.conf中获取您的 pg_hba.conf 文件

并且只需将列方法下的 scram-sha-256 更改为信任。

在此处输入图像描述

它对我有用!

于 2021-06-09T07:23:14.637 回答
14

根据wiki,支持的SCRAM-SHA-256加密 JDBC 驱动程序是 42.2.0 或更高版本。就我而言,驱动程序是 41.1.1。将其更改为 42.2.0 或更高版本。那为我修好了。

(马文,pom.xml):

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.0</version>
</dependency>
于 2021-01-17T08:40:43.323 回答
6

通过设置password_encryptionscram-sha-256(这是 v13 中的默认值),您也可以获得身份验证,scram-sha-256即使您拥有md5.pg_hba.conf

现在您在客户端使用旧的 JDBC 驱动程序版本,它不支持该身份验证方法,尽管 PostgreSQL 在三年前的 v10 中引入了它。

您应该升级您的 JDBC 驱动程序。另一种方法是设置password_encryptionmd5,但是您必须重置所有密码并以较低的安全性生活。

于 2020-10-05T15:27:21.683 回答
5
<?xml version="1.0" encoding="UTF-8"?>

4.0.0

<groupId>org.example</groupId>
<artifactId>postgresJDBC</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
    <java.version>11</java.version>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <maven.compiler.source>${java.version}</maven.compiler.source>
</properties>

<dependencies>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.18</version>
    </dependency>
</dependencies>

如果您使用的是 postgresql 9.1+,则必须检查您的 maven 依赖项,那么您的依赖项应该类似于上面

要了解 Maven 依赖项,请参阅此链接How do you add PostgreSQL Driver 作为 Maven 中的依赖项?

于 2020-12-27T13:20:02.923 回答
5

在 pg_hba.conf 中将 METHOD 更改为“信任”

于 2021-02-18T08:38:52.573 回答
2

在 12.6 版上运行良好......只需降级 PostgreSQL

于 2021-05-01T12:41:56.730 回答
0

您可能需要检查您正在运行的 Postgres 的版本。如果版本是通过 spring 父级指向的,则可能需要更新 spring 版本。就我而言:因为当前的 postgres 是 v13。Modified spring parent version: it was on 1.4; made it to match to 2.14. Finally update maven dependency and re-run the application.这解决了这个问题。

于 2021-05-11T23:12:17.307 回答
0

使用这些:

  1. wget https://jdbc.postgresql.org/download/postgresql-42.2.24.jar

将其复制到您的配置单元库

  1. sudo mv postgresql-42.2.24.jar /opt/hive/lib/postgresql-42.2.24.jar
于 2021-10-23T11:07:51.633 回答
-2

我想这个问题的解决方案是使用 9.6 版。更改版本后它工作得很好。

于 2020-10-06T07:55:42.100 回答
-2

在 pom.xml 中为 Postgres 使用最新的 maven 依赖项

于 2020-12-02T05:36:07.997 回答