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

Unable to connect to Postgres DB due to the authentication type 10 is not supported

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

org.postgresql.util.PSQLException: The authentication type 10 is not supported. Check that you have configured the pg_hba.conf file to include the client's IP address or subnet, and that it is using an authentication scheme supported by the driver. at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:614) ~[postgresql-42.1.4.jar:42.1.4] at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:222) ~[postgresql-42.1.4.jar:42.1.4] at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) ~[postgresql-42.1.4.jar:42.1.4] at 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] at org.postgresql.Driver.connect(Driver.java:252) ~[postgresql-42.1.4.jar:42.1.4] at java.sql.DriverManager.getConnection(Unknown Source) [na:1.8.0_261] at java.sql.DriverManager.getConnection(Unknown Source) [na:1.8.0_261] at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:94) [postgresql-42.1.4.jar:42.1.4] at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:79) [postgresql-42.1.4.jar:42.1.4]

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

修改了引用 this post 的 pg_hba.cfg 文件 - 不起作用

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

请给我一个解决这个问题的建议。

我的代码和配置:

    @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)

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

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

您应该升级 JDBC 驱动程序。另一种方法是将 password_encryption 设置回 md5,但随后您将不得不重置所有密码并以较低的安全性生活。

我想这个问题的解决方案是使用 9.6 版。 改版本后就正常了

我通过在 PostgreSQL 版本 13:

中应用以下步骤解决了类似问题
  1. postgresql.conf
  2. 中将password_encryption更改为md5
Windows: C:\Program Files\PostgreSQL\data\postgresql.conf
GNU/Linux:           /etc/postgresql/13/main/postgresql.conf

  1. pg_hba.conf
  2. 中将scram-sha-256更改为md5
Windows: C:\Program Files\PostgreSQL\data\pg_hba.conf
GNU/Linux:           /etc/postgresql/13/main/pg_hba.conf
host    all             all             0.0.0.0/0               md5

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

    示例:ALTER ROLE postgres WITH PASSWORD 'root'

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

在 pom.xml

中对 Postgres 使用最新的 Maven 依赖项
<?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 依赖性,请参阅此 link How do you add PostgreSQL Driver as a dependency in Maven?

根据 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>

在 pg_hba.conf

中将方法更改为“信任”

在 12.6 版本上工作正常...只需降级 PostgreSQL

您可能需要检查您使用的 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。这解决了问题。

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

并且只需将 Column Method 下的 scram-sha-256 更改为 trust。

对我有用!

使用这些:

  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

更改对 ipv4 本地连接的信任对我有用。

解决方案:

在目录 C:\Program Files\PostgreSQL\data\pg_hba.conf

中获取您的 pg_hba.conf 文件

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

如果您在 Docker 中遇到困难:

  1. 首先:运行容器-e POSTGRES_HOST_AUTH_METHOD=md5 (doc)
docker run -e POSTGRES_HOST_AUTH_METHOD=md5 -e POSTGRES_PASSWORD=doesntmatter -p 5432:5432 --name CONTAINERNAME -d postgres
  1. 其次:允许 md5 加密,如其他答案中所述:
docker exec -ti -u postgres CONTAINERNAME bash -c "echo 'password_encryption=md5' >> /var/lib/postgresql/data/postgresql.conf"
  1. 第三:重启容器
docker restart CONTAINER NAME
  1. 第四:您需要以md5格式重新创建postgres密码
docker exec -ti -u postgres CONTAINERNAME psql

alter role postgres with a password 'THE-NEW-PASSWORD';

* 请注意 scram-sha-256 比 md5 (doc)

好得多

对我来说,更新 postgres 库有助于解决这个问题。