使用身份验证的 Derby 嵌入式数据库

Posted

技术标签:

【中文标题】使用身份验证的 Derby 嵌入式数据库【英文标题】:Derby Embedded Database using Authentication 【发布时间】:2015-07-15 06:14:58 【问题描述】:

Apache Derby 嵌入式数据库在默认情况下不需要身份验证。我们可以在系统级别或数据库级别启用身份验证。我使用 java 代码进行了系统级启用。

Properties p=System.getProperties();
p.put("derby.connection.requireAuthentication", "true");

然后我尝试使用此连接 URL 创建数据库。

jdbc:derby:derbysample;create=true;user=root;password=root

当我运行它时

DriverManager.getConnection(connectionURL);

它创建数据库文件夹也会引发有关身份验证的错误?如何使用凭据创建数据库?

java.sql.SQLNonTransientConnectionException:连接身份验证 发生故障。原因:身份验证无效.. at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(未知 来源)在 org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(未知 来源)在 org.apache.derby.impl.jdbc.Util.generateCsSQLException(未知来源) 在 org.apache.derby.impl.jdbc.Util.generateCsSQLException(未知 来源)在 org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(未知 来源)在 org.apache.derby.impl.jdbc.EmbedConnection.checkUserCredentials(未知 来源)在 org.apache.derby.impl.jdbc.EmbedConnection.(未知 来源)在 org.apache.derby.jdbc.InternalDriver.getNewEmbedConnection(未知 来源)在 org.apache.derby.jdbc.InternalDriver.connect(未知 来源)在 org.apache.derby.jdbc.InternalDriver.connect(未知 来源)在 org.apache.derby.jdbc.AutoloadedDriver.connect(未知 来源)在 java.sql.DriverManager.getConnection(DriverManager.java:664) 在 java.sql.DriverManager.getConnection(DriverManager.java:208) 在 derbytest.DerbyTest.createConnection(DerbyTest.java:56) 在 derbytest.DerbyTest.main(DerbyTest.java:39) 原因:错误 08004: 发生连接身份验证失败。原因:无效 认证..在 org.apache.derby.iapi.error.StandardException.newException(未知 来源)在 org.apache.derby.impl.jdbc.SQLExceptionFactory.wrapArgsForTransportAcrossDRDA(未知 来源)... 15 更多

【问题讨论】:

有大量关于 Derby 安全功能的文档,包括关于身份验证的完整部分:db.apache.org/derby/docs/10.11/security/cseccsecure42374.html 【参考方案1】:

首先使用属性create=true指定您要创建的数据库URL

jdbc:derby:derbysample111;create=true

然后使用DriverManager 获取连接。如果不存在,它将创建一个数据库。

conn = DriverManager.getConnection("jdbc:derby:derbysample111;create=true");
conn.setSchema("APP");

然后在 derby 中启用身份验证并设置用户和密码。它将设置数据库级别的身份验证。

Statement s = conn.createStatement();
s.executeUpdate("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(\n"
            + "    'derby.connection.requireAuthentication', 'true')");
s.executeUpdate("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(\n"
            + "    'derby.authentication.provider', 'BUILTIN')");
s.executeUpdate("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(\n"
            + "    'derby.user.root', '12345')");
s.executeUpdate("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(\n"
            + "    'derby.database.propertiesOnly', 'true')");

只需要设置一次。然后可以使用此 URL 访问您的数据库

jdbc:derby:derbysample111;create=true;user=root;password=12345

【讨论】:

以上是关于使用身份验证的 Derby 嵌入式数据库的主要内容,如果未能解决你的问题,请参考以下文章

在独立 Java 应用程序中设置嵌入式 Derby 数据库

使用 Apache Derby 作为嵌入式数据库的 Spring-boot 错误

在运行时指定在何处创建或打开 Derby 嵌入式数据库

如何在 Windows 环境中写入安装在“C:\Program Files”中的 Java 桌面应用程序的嵌入式 derby 数据库?

有关与Apache Derby和Java连接的协议

Apache 嵌入式 derby TIMESTAMPDIFF 函数在夏令时后额外返回 1 小时