Сервер TomEE ORA-01017 пытается аутентифицироваться пользователем ОС

У меня есть две базы данных на удаленной машине, и я хочу использовать их в CMT на TomEE 7.0.2. Я настроил два источника данных XA в своем tomee.xml и столкнулся с проблемой входа в систему. Сервер приложений не может создать источники данных из-за ошибки. Имя пользователя и пароль правильно указаны в xml. Я создал тест, чтобы проверить, не делает ли ojdbc7.jar что-то неприятное, но он может войти в систему, как должен.

Проблема

Я отладил TomEE, чтобы проверить пакеты и с wireshark. Проблема, похоже, внутри TomEE. Запрос, отправленный на машину оракула, содержит следующее:

(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

Другие неработающие решения:

Я проверил следующее, но это не решение моей проблемы:

  • #P18#

A) У меня нет свойства factory, которое вызвало проблему в соответствии с принятым ответом.

Б) Я использую последний драйвер Oracle, и база данных также 12, несмотря на то, что я создал простой тест, представленный ниже.

  • #P21#

A) Я использую Linux на обеих машинах, и я нахожусь на другом сервере приложений с Java.

  • #P23#

person Hash    schedule 30.08.2017    source источник


Ответы (3)


Вы можете игнорировать имя пользователя в строке подключения. Это не тот, который используется для аутентификации.

Я думаю, что ваша конфигурация источника данных неверна. Согласно документации по конфигурации 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

person fhossfel    schedule 30.08.2017
comment
Тоже самое. ORA-01017: invalid username/password; logon denied - person Hash; 30.08.2017
comment
Вы уверены, что пользователь/пароль работает для входа в БД? - person fhossfel; 30.08.2017
comment
Вы намеренно изменили имя пользователя на имя пользователя в своем сообщении? Вы можете удалить строку passwordCipher. Это не должно быть необходимо. - person fhossfel; 31.08.2017
comment
Перепробовал все комбинации имен. Сервер не принимает его, не имеет значения, использую ли я форму в верхнем регистре или нет. - person Hash; 31.08.2017

Здесь нужно сделать несколько замечаний:

Часть пользователя ОС

Драйвер отправляет эту информацию не как часть процесса аутентификации, а как среду для запуска входа в систему. Это означает, что значение входа отправляется в другом запросе. Если вы следите за потоком TCP, используя CANARY в качестве пароля и пользователя, вы можете проверить, содержится ли он в какой-либо форме в запросе. Упомянутые конфигурации НЕ будут его содержать.

Настоящая проблема

Настоящая проблема заключается в том, что 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 уведомлен о проблеме.)

введите здесь описание изображения

person Hash    schedule 01.09.2017

Чтобы прояснить, что происходит и почему документ выглядит неправильно:

  • используя имя класса, вы настраиваете упомянутый вами класс. Tomee не знает об этом, но предоставляет вспомогательную команду setters в tomee.sh
  • используя тип DataSource, вы запрашиваете пул источников данных, и здесь userName является допустимым и именем пользователя, которое использует пул. В зависимости от реализации xadatasource он игнорируется или не используется в пользу пользовательской конфигурации xa (которая также может иметь другое имя)

Другими словами, oracleXADS — это не источник данных tomee, а пользовательский ресурс, поддерживающий внедрение DataSource.

Документ посвящен только объединению томов.

person Romain Manni-Bucau    schedule 06.09.2017