[英]TomEE ORA-01017 server tries to authenticate with OS user
我在远程计算机上有两个数据库,我想在TomEE 7.0.2
CMT
使用它们。 我在tomee.xml
配置了两个XA数据源,但遇到登录问题。 应用程序服务器在遇到错误时无法创建数据源。 用户名和密码已在xml中正确设置。 我创建了一个测试,以检查ojdbc7.jar
是否执行了某些令人讨厌的操作,但是它能够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
其他不起作用的解决方案:
我检查了以下内容,但不是我的问题的解决方案:
答:根据公认的答案,我没有导致问题的factory
财产。
B)尽管我创建了下面提供的简单测试,但我使用的是最新的Oracle驱动程序,数据库也为12。
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
这里有几点要说明:
操作系统用户部分
驱动程序发送此信息不是作为身份验证过程的一部分,而是作为启动登录的环境。 这意味着登录值是在其他请求中发送的。 如果使用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
邮件列表。)
为了澄清正在发生的事情以及文档看起来错误的原因:
换句话说,oracleXADS并不是tomee数据源,而是支持DataSource注入的用户资源。
该文档仅与tomee池有关
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.