TomEE ORA-01017 服务器尝试与 OS 用户进行身份验证
TomEE ORA-01017 server tries to authenticate with OS user
我在远程机器上有两个数据库,我想在 TomEE 7.0.2
上使用 CMT
中的那些数据库。我在 tomee.xml
中配置了两个 XA 数据源,但遇到了登录问题。应用程序服务器无法创建数据源,因为它遇到错误。 xml 中正确设置了用户名和密码。我创建了一个测试来检查 ojdbc7.jar
是否做了一些令人讨厌的事情,但它能够正常登录。
问题
我调试了 TomEE
来检查 wireshark
的包。问题似乎在 TomEE
内部。发送到 oracle 机器的请求包含以下内容:
(DESCRIPTION=(CONNECT_DATA=(SID=DBNAME)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=osuser)))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.10)(PORT=1521)))
如您所见,此连接数据尝试使用 osuser 而不是 tomee.xml
.
中指定的用户
我也根据http://tomee.apache.org/datasource-config.html尝试了不同的配置。
问题
如何配置 TomEE
以使用提供的用户名和密码进行数据库连接?
申请:
tomee.xml:
默认 PasswordCipher
是 PlainText
包含它以确保它。
<?xml version="1.0" encoding="UTF-8"?>
<tomee>
<Resource id="oracleDS" type="DataSource">
XaDataSource oracleXADS
DataSourceCreator dbcp-alternative
</Resource>
<Resource id="oracleXADS" type="XADataSource" class-name="oracle.jdbc.xa.client.OracleXADataSource">
Url jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
Username user
PasswordCipher PlainText
Password pass
</Resource>
<Resource id="postgreDS" type="DataSource">
XaDataSource postgreXADS
DataSourceCreator dbcp-alternative
</Resource>
<Resource id="postgreXADS" type="XADataSource" class-name="org.postgresql.xa.PGXADataSource">
Url jdbc:postgresql://192.168.1.10:5432/DBNAME
Username user
PasswordCipher PlainText
Password pass
</Resource>
</tomee>
也试过这种格式:
<Resource id="oracleXADS" type="javax.sql.XADataSource" class-name="oracle.jdbc.xa.client.OracleXADataSource">
url = jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
userName = user
passwordCipher = PlainText
password = pass
</Resource>
persistence.xml:
<persistence-unit name="oraDS" transaction-type="JTA">
<jta-data-source>oracleXADS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>
<persistence-unit name="pgDS" transaction-type="JTA">
<jta-data-source>postgreXADS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>
测试文件相同ojdbc7.jar
TestDatasource.java
的相关部分
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("Oracle JDBC Driver Registered!");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.10:1521:DBNAME", "user", "pass");
//connection is checked and it is OK
相关TestXADatasource.java
OracleXADataSource oxds = new OracleXADataSource();
oxds.setURL("jdbc:oracle:thin:@192.168.1.10:1521:DBNAME");
oxds.setUser("user");
oxds.setPassword("pass");
XAConnection pc = oxds.getXAConnection();
Connection conn1 = pc.getConnection();
//connection is checked and it is OK
其他无效的解决方案:
我检查了以下内容,但这些都不是我的问题的解决方案:
giving correct username& password, get ORA-01017: invalid username/password; logon denied
A) 根据接受的答案,我没有 factory
属性 导致问题。
B) 我使用最新的 Oracle 驱动程序,数据库也是 12,尽管我创建了下面提供的简单测试。
Oracle.ManagedDataAccess and ORA-01017: invalid username/password; logon denied
A) 我在两台机器上都使用 linux 并且我在不同的应用程序服务器上使用 Java
.
您可以忽略连接字符串中的用户名。它不是用于身份验证的。
我认为你的数据源配置不正确。根据 TomEE 配置文档 [1],它应该如下所示:
<Resource id="oracleDS" type="DataSource">
JdbcDriver oracle.jdbc.OracleDriver
JdbcUrl jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
UserName user
Password pass
</Resource>
<Resource id="oracleXADS" type="DataSource">
JdbcDriver oracle.jdbc.xa.client.OracleXADataSource
JdbcUrl jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
UserName user
Password pass
</Resource>
[1] http://tomee.apache.org/common-datasource-configurations.html
这里有几点需要说明:
OS用户部分
驱动程序发送此信息不是作为身份验证过程的一部分,而是作为启动登录的环境。这意味着登录值是在不同的请求中发送的。如果您使用 CANARY
作为密码和用户关注 TCP
流,您可以检查它是否以任何形式包含在请求中。 提到的配置不会包含它。
真正的问题
真正的问题是http://tomee.apache.org/datasource-config.html是错误的。 userName
不是有效的用户名声明。有效声明如下:
<Resource id="oracleDS" type="DataSource">
XaDataSource oracleXADS
DataSourceCreator dbcp-alternative
</Resource>
<Resource id="oracleXADS" type="javax.sql.DataSource" class-name="oracle.jdbc.xa.client.OracleXADataSource">
url jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
user user
passwordCipher PlainText
password password
</Resource>
TL.DR.: 文档有误。在对发布的配置进行唯一更改 userName->user 之后,TCP
流包含必要的用户名并且登录成功。 (Apache TomEE
邮件列表已收到有关该问题的通知。)
澄清发生了什么以及文档看起来有误的原因:
- 使用 class-name 配置您提到的 class。 Tomee 并不知道它,但在 tomee.sh
中提供了一个 setters helper 命令
- 使用 DataSource 类型请求数据源池,这里的 userName 是有效的,也是池使用的用户名。根据 xadatasource impl,它被忽略或不支持 xa 用户配置(也可以有另一个名称)
换句话说,oracleXADS 不是 tomee 数据源,而是支持数据源注入的用户资源
该文档仅与 tomee 池有关
我在远程机器上有两个数据库,我想在 TomEE 7.0.2
上使用 CMT
中的那些数据库。我在 tomee.xml
中配置了两个 XA 数据源,但遇到了登录问题。应用程序服务器无法创建数据源,因为它遇到错误。 xml 中正确设置了用户名和密码。我创建了一个测试来检查 ojdbc7.jar
是否做了一些令人讨厌的事情,但它能够正常登录。
问题
我调试了 TomEE
来检查 wireshark
的包。问题似乎在 TomEE
内部。发送到 oracle 机器的请求包含以下内容:
(DESCRIPTION=(CONNECT_DATA=(SID=DBNAME)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=osuser)))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.10)(PORT=1521)))
如您所见,此连接数据尝试使用 osuser 而不是 tomee.xml
.
我也根据http://tomee.apache.org/datasource-config.html尝试了不同的配置。
问题
如何配置 TomEE
以使用提供的用户名和密码进行数据库连接?
申请:
tomee.xml:
默认 PasswordCipher
是 PlainText
包含它以确保它。
<?xml version="1.0" encoding="UTF-8"?>
<tomee>
<Resource id="oracleDS" type="DataSource">
XaDataSource oracleXADS
DataSourceCreator dbcp-alternative
</Resource>
<Resource id="oracleXADS" type="XADataSource" class-name="oracle.jdbc.xa.client.OracleXADataSource">
Url jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
Username user
PasswordCipher PlainText
Password pass
</Resource>
<Resource id="postgreDS" type="DataSource">
XaDataSource postgreXADS
DataSourceCreator dbcp-alternative
</Resource>
<Resource id="postgreXADS" type="XADataSource" class-name="org.postgresql.xa.PGXADataSource">
Url jdbc:postgresql://192.168.1.10:5432/DBNAME
Username user
PasswordCipher PlainText
Password pass
</Resource>
</tomee>
也试过这种格式:
<Resource id="oracleXADS" type="javax.sql.XADataSource" class-name="oracle.jdbc.xa.client.OracleXADataSource">
url = jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
userName = user
passwordCipher = PlainText
password = pass
</Resource>
persistence.xml:
<persistence-unit name="oraDS" transaction-type="JTA">
<jta-data-source>oracleXADS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>
<persistence-unit name="pgDS" transaction-type="JTA">
<jta-data-source>postgreXADS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>
测试文件相同ojdbc7.jar
TestDatasource.java
的相关部分Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("Oracle JDBC Driver Registered!");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.10:1521:DBNAME", "user", "pass");
//connection is checked and it is OK
相关TestXADatasource.java
OracleXADataSource oxds = new OracleXADataSource();
oxds.setURL("jdbc:oracle:thin:@192.168.1.10:1521:DBNAME");
oxds.setUser("user");
oxds.setPassword("pass");
XAConnection pc = oxds.getXAConnection();
Connection conn1 = pc.getConnection();
//connection is checked and it is OK
其他无效的解决方案:
我检查了以下内容,但这些都不是我的问题的解决方案:
giving correct username& password, get ORA-01017: invalid username/password; logon denied
A) 根据接受的答案,我没有 factory
属性 导致问题。
B) 我使用最新的 Oracle 驱动程序,数据库也是 12,尽管我创建了下面提供的简单测试。
Oracle.ManagedDataAccess and ORA-01017: invalid username/password; logon denied
A) 我在两台机器上都使用 linux 并且我在不同的应用程序服务器上使用 Java
.
您可以忽略连接字符串中的用户名。它不是用于身份验证的。
我认为你的数据源配置不正确。根据 TomEE 配置文档 [1],它应该如下所示:
<Resource id="oracleDS" type="DataSource">
JdbcDriver oracle.jdbc.OracleDriver
JdbcUrl jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
UserName user
Password pass
</Resource>
<Resource id="oracleXADS" type="DataSource">
JdbcDriver oracle.jdbc.xa.client.OracleXADataSource
JdbcUrl jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
UserName user
Password pass
</Resource>
[1] http://tomee.apache.org/common-datasource-configurations.html
这里有几点需要说明:
OS用户部分
驱动程序发送此信息不是作为身份验证过程的一部分,而是作为启动登录的环境。这意味着登录值是在不同的请求中发送的。如果您使用 CANARY
作为密码和用户关注 TCP
流,您可以检查它是否以任何形式包含在请求中。 提到的配置不会包含它。
真正的问题
真正的问题是http://tomee.apache.org/datasource-config.html是错误的。 userName
不是有效的用户名声明。有效声明如下:
<Resource id="oracleDS" type="DataSource">
XaDataSource oracleXADS
DataSourceCreator dbcp-alternative
</Resource>
<Resource id="oracleXADS" type="javax.sql.DataSource" class-name="oracle.jdbc.xa.client.OracleXADataSource">
url jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
user user
passwordCipher PlainText
password password
</Resource>
TL.DR.: 文档有误。在对发布的配置进行唯一更改 userName->user 之后,TCP
流包含必要的用户名并且登录成功。 (Apache TomEE
邮件列表已收到有关该问题的通知。)
澄清发生了什么以及文档看起来有误的原因:
- 使用 class-name 配置您提到的 class。 Tomee 并不知道它,但在 tomee.sh 中提供了一个 setters helper 命令
- 使用 DataSource 类型请求数据源池,这里的 userName 是有效的,也是池使用的用户名。根据 xadatasource impl,它被忽略或不支持 xa 用户配置(也可以有另一个名称)
换句话说,oracleXADS 不是 tomee 数据源,而是支持数据源注入的用户资源
该文档仅与 tomee 池有关