繁体   English   中英

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是否执行了某些令人讨厌的操作,但是它能够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

其他不起作用的解决方案:

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

答:根据公认的答案,我没有导致问题的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邮件列表。)

在此处输入图片说明

为了澄清正在发生的事情以及文档看起来错误的原因:

  • 使用class-name可以配置您提到的类。 Tomee未知,但在tomee.sh中提供了setters helper命令。
  • 使用数据源类型,您需要一个数据源池,此处的用户名有效,且池使用的用户名。 根据xadatasource的隐式表示,它被忽略还是不赞成xa用户配置(也可以使用其他名称)

换句话说,oracleXADS并不是tomee数据源,而是支持DataSource注入的用户资源。

该文档仅与tomee池有关

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM