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:

默认 PasswordCipherPlainText 包含它以确保它。

<?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

其他无效的解决方案:

我检查了以下内容,但这些都不是我的问题的解决方案:

A) 根据接受的答案,我没有 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

这里有几点需要说明:

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 池有关