由于不支持身份验证类型 10,无法连接到 Postgres DB

Tus*_*nne 17 java postgresql gradle spring-boot postgresql-13

我最近尝试了 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 文件- 不起作用

使用已弃用的 Lib - 也不起作用。

请建议我解决这个问题。

我的代码和配置:

    @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;
        
    }

}
Run Code Online (Sandbox Code Playgroud)

依赖

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")
Run Code Online (Sandbox Code Playgroud)

password_encryption 设置如下:

postgres=# show password_encryption;
 password_encryption
---------------------
 scram-sha-256
(1 row)
Run Code Online (Sandbox Code Playgroud)

小智 20

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

  1. 将 password_encryption 更改为 md5。

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

    在此处输入图片说明

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

    文件: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

  • 我强烈建议人们遵循[这个答案](/sf/answers/4603108191/),即将 PostgreSQL JDBC 驱动程序升级到 42.2.0 或更高版本。 (5认同)
  • 这降低了驾驶员的安全性。您可能需要考虑升级 JDBC 驱动程序。 (4认同)
  • 不要忘记 ALTER ROLE 语句末尾的“;”。我花了一段时间才意识到。;) (2认同)

Buk*_*yed 9

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

并简单地将列方法下的 scram-sha-256 更改为信任。

在此处输入图片说明

它对我有用!


小智 7

<?xml version="1.0" encoding="UTF-8"?>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 postgresql 9.1+,则必须检查您的 Maven 依赖项,那么您的依赖项应如上所示

要了解 Maven 依赖项,请参阅此链接如何将 PostgreSQL 驱动程序添加为 Maven 中的依赖项?


Lau*_*lbe 6

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

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

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

  • 升级驱动程序也为我完成了这项工作。 (3认同)
  • 这应该是公认的答案,因为更改 pg_hba.conf 中的值只是一种解决方法,真正的解决方案是将 JDBC 驱动程序版本升级到支持 `scram-sha-256` 的版本。例如版本“8.1-404.jdbc”不支持它,但版本“42.2.19”支持。 (2认同)

noa*_*myg 6

根据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>
Run Code Online (Sandbox Code Playgroud)


小智 5

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