使用JDBC连接CrateDB 5.10.3时超级用户认证失败问题求助
使用JDBC连接CrateDB 5.10.3时超级用户认证失败问题求助
我最近在尝试用JDBC连接本地运行的CrateDB,折腾了好几种方法都卡在超级用户认证这一步,实在没辙了来求助大家!
最初的尝试:使用PostgreSQL驱动
我写了一段很简单的测试代码:
public class Main { private static String connectionURL = "jdbc:postgresql://localhost:5432/"; public static void main(String[] args) throws SQLException { Properties props = new Properties(); props.setProperty("user", "crate"); Connection sqlConnection = DriverManager.getConnection(connectionURL, props); if(!sqlConnection.isClosed()) { System.out.println("Connection is open!"); } else { System.out.println("Connection is closed!"); } } }
Maven依赖配置是这样的:
<dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>LATEST</version> </dependency> <dependency> <groupId>com.beust</groupId> <artifactId>jcommander</artifactId> <version>1.82</version> </dependency> </dependencies>
CrateDB的认证配置
我的crate.yml里的认证规则是按照文档设置的,本地连接的超级用户crate应该走trust认证,不需要密码:
auth: host_based: enabled: true config: 0: user: crate address: _local_ method: trust 99: method: password
遇到的错误
但运行代码后直接报错,说服务器要求SCRAM认证但没提供密码:
Exception in thread "main" org.postgresql.util.PSQLException: The server requested SCRAM-based authentication, but no password was provided. at org.postgresql.core.v3.ConnectionFactoryImpl.lambda$doAuthentication$5(ConnectionFactoryImpl.java:848) at org.postgresql.core.v3.AuthenticationPluginManager.withPassword(AuthenticationPluginManager.java:82) at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:845) at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:213) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:268) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54) at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:273) at org.postgresql.Driver.makeConnection(Driver.java:446) at org.postgresql.Driver.connect(Driver.java:298) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:191) at src.main.java.com.XXXX.Main.main(Main.java:17)
如果我强行给Properties加密码属性,又会报错说超级用户密码为空,认证失败——关键是CrateDB的超级用户本来就没法设置密码啊!
后来我还尝试新建了一个带密码的Admin用户,给了它所有权限,结果还是遇到同样的认证错误。
尝试换用Crate官方JDBC驱动
不死心的我换了Crate官方的JDBC驱动,依赖改成:
<dependencies> <dependency> <groupId>io.crate</groupId> <artifactId>crate-jdbc</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>com.beust</groupId> <artifactId>jcommander</artifactId> <version>1.82</version> </dependency> </dependencies>
代码里的连接URL也改成了jdbc:crate://localhost:5432/,结果报错更奇怪,直接说密码为空:
Exception in thread "main" io.crate.shade.org.postgresql.util.PSQLException: Etwas Ungewöhnliches ist passiert, das den Treiber fehlschlagen ließ. Bitte teilen Sie diesen Fehler mit. at io.crate.shade.org.postgresql.Driver.connect(Driver.java:265) at io.crate.client.jdbc.CrateDriver.connect(CrateDriver.java:65) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:191) at src.main.java.com.XXXX.Main.main(Main.java:17) Caused by: java.lang.IllegalArgumentException: Null value for 'password' at com.ongres.scram.common.util.Preconditions.checkNotNull(Preconditions.java:41) at com.ongres.scram.common.util.Preconditions.checkNotEmpty(Preconditions.java:55) at com.ongres.scram.client.ScramSession$ServerFirstProcessor.clientFinalProcessor(ScramSession.java:130) at io.crate.shade.org.postgresql.jre8.sasl.ScramAuthenticator.processServerFirstMessage(ScramAuthenticator.java:131) at io.crate.shade.org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:663) at io.crate.shade.org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:141) at io.crate.shade.org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:192) at io.crate.shade.org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) at io.crate.shade.org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:206) at io.crate.shade.org.postgresql.Driver.makeConnection(Driver.java:442) at io.crate.shade.org.postgresql.Driver.connect(Driver.java:244) ... 4 more
我的需求
其实我还是更想用PostgreSQL驱动,不想切换到官方的这个。谷歌搜了好半天都没找到对应的解决方案,有没有大佬能指点一下?
我的预期特别简单,就是程序能输出Connection is open!,证明Java代码能成功连接上CrateDB就行。
备注:内容来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

