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

时间:2020-10-05 14:01:17

标签: java postgresql spring-boot gradle 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]在 org.postgresql.Driver.makeConnection(Driver.java:450) 〜[postgresql-42.1.4.jar:42.1.4]在 org.postgresql.Driver.connect(Driver.java:252) 〜[postgresql-42.1.4.jar:42.1.4]在 java.sql.DriverManager.getConnection(未知来源)[na:1.8.0_261] 在java.sql.DriverManager.getConnection(未知来源) [na:1.8.0_261]在 org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:94) [postgresql-42.1.4.jar:42.1.4]位于 org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:79) [postgresql-42.1.4.jar:42.1.4]

我也尝试使用JDBCTemplate。不起作用

修改了pg_hba.cfg文件,引用了this帖子-不起作用

使用了已弃用的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;
        
    }

}

依赖项

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)

10 个答案:

答案 0 :(得分:6)

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

  1. 将password_encryption更改为md5。

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

    enter image description here

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

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

    全部托管0.0.0.0/0 md5

    enter image description here

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

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

  4. 如果要进行非生产工作,请确保设置listen_addresses = '*' 环境。

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

答案 1 :(得分:4)

<?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 as a dependency in Maven?

答案 2 :(得分:4)

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

(Maven,pom.xml):

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.0</version>
</dependency>

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

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

您应该升级JDBC驱动程序。一种替代方法是将password_encryption设置回md5,但是您将不得不重置所有密码并降低安全性。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

enter image description here

它对我有用!

答案 7 :(得分:0)

我想解决此问题的方法是使用9.6版。 更改版本后,它就可以正常工作。

答案 8 :(得分:0)

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

答案 9 :(得分: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。这解决了问题。