如何在Groovy中强制使用UNIX域套接字无密码连接PostgreSQL?
通过Groovy使用UNIX域套接字免密连接PostgreSQL
环境信息
- Groovy版本:4.0.12
- JVM版本:17.0.11(Debian)
- 操作系统:Linux
- PostgreSQL连接现状:psql可通过UNIX域套接字免密连接,执行
psql -c '\conninfo'输出:
You are connected to database "xxx" as user "xxx" via socket in "/var/run/postgresql" at port "5432".
问题描述
使用以下Groovy代码尝试连接时抛出认证错误:
import groovy.sql.Sql def url = "jdbc:postgresql://" def driver = "org.postgresql.Driver" Sql.withInstance(url, null, null, driver) { sql -> // 数据库操作逻辑 }
错误信息:
Caught: org.postgresql.util.PSQLException: The server requested SCRAM-based authentication, but no password was provided.
问题根源:PostgreSQL JDBC驱动未自动使用UNIX域套接字,转而尝试TCP连接,触发了密码认证要求。
解决方法
要强制驱动使用UNIX域套接字,需在JDBC URL中明确指定套接字路径,有两种可行方式:
方式1:指定UnixSocketFactory
通过socketFactory参数指定UNIX套接字工厂类,并传入套接字目录路径:
import groovy.sql.Sql def url = "jdbc:postgresql:///?socketFactory=org.postgresql.core.UnixSocketFactory&socketFactoryArg=/var/run/postgresql" def driver = "org.postgresql.Driver" Sql.withInstance(url, null, null, driver) { sql -> println "连接成功" // 执行数据库操作 }
方式2:简化URL格式(JDBC 4.2+支持)
从PostgreSQL JDBC驱动4.2版本开始,可直接通过host参数指定套接字路径,同时带上目标数据库名称:
import groovy.sql.Sql def url = "jdbc:postgresql:///xxx?host=/var/run/postgresql" def driver = "org.postgresql.Driver" Sql.withInstance(url, null, null, driver) { sql -> println "连接成功" // 执行数据库操作 }
注:xxx需替换为实际要连接的数据库名称,与psql连接的数据库保持一致。
额外说明
- 确保PostgreSQL JDBC驱动版本在9.4及以上(该版本开始支持UNIX域套接字功能)。
- 免密连接的前提是PostgreSQL的
pg_hba.conf配置文件中,已对UNIX域套接字连接设置trust或peer认证规则(这也是psql能免密连接的基础)。
内容的提问来源于stack exchange,提问作者ceving
相关产品推荐
相关产品推荐

