Как отправить имя пользователя между запросами веб-службы? - PullRequest
1 голос
/ 21 мая 2009

В основном проблема заключается в следующем:
Существует хранимая процедура базы данных, которая принимает имя пользователя в качестве аргумента и создает некоторые XML-данные в зависимости от него. Он вызывается методом без аргументов в незащищенном веб-сервисе (назовем этот веб-сервис WSA). Существует также другой веб-сервис (назовем его WSB), который должен вызывать WSA. В этой настройке WSA должен вызываться только WSB и никогда никем другим. WSB - это то, что называют пользователи, и способ, которым они получают необходимые данные XML. Веб-сервисы развернуты на OC4J, и на них включена защита. WSB защищен OC4J и доступен посредством предоставления имени пользователя и пароля пользователя OC4J.
При тестировании веб-службы OC4J предоставляет вам форму, в которой вы можете ввести информацию для входа в систему до вызова веб-службы. Если вы решите включить информацию о безопасности в заголовок и предварительно просмотреть сообщение перед вызовом службы, в сообщении будут указаны имя пользователя и пароль.
Моя проблема в том, что я не могу получить информацию о безопасности (или, по крайней мере, имя пользователя), чтобы достичь реализации конечной точки и вызова хранимой процедуры. До сих пор я создал WSA, создал прокси-сервер веб-службы, который ссылается на него, и создал WSB на основе прокси.
Что я пробовал до сих пор, чтобы получить имя пользователя (и почему оно не работает):

  1. Имел WSA javax.xml.rpc.server.ServiceLifecycle. Это предоставляет WSA экземпляр javax.xml.rpc.server.ServletEndpointContext, который предоставляет мне java.security.Principal. Однако это Principal равно null, если я вызываю WSB (который, в свою очередь, вызывает WSA). Если я защищаю WSA и вызываю его напрямую, Pricipal не является нулевым и содержит пользователя (но это не решает проблему, потому что мне нужно вызывать WSB, а не WSA).

  2. Созданы обработчики (расширяющие javax.xml.rpc.handler.GenericHandler) для обеих служб, которые должны были обрабатывать сообщение. Одна вещь действительно сбила меня с толку здесь. Методы обработчика вызываются правильно - обработчик WSB обрабатывает запрос, затем обработчик WSA обрабатывает запрос, затем обработчик WSA обрабатывает ответ и, наконец, обработчик WSB обрабатывает ответ. Но когда я пытался печатать сообщения в файл на каждом шаге, я обнаружил, что даже на первом шаге (когда WSB обрабатывает запрос) в сообщении нет информации о безопасности. Нет имени пользователя, нет ничего. Сообщение на самом деле довольно сильно отличается от того, что показано на странице вызова при предварительном просмотре сообщения запроса перед вызовом службы.

  3. Попытка внедрения экземпляра WebServiceContext с использованием аннотации @Resource, но, очевидно, OC4J не поддерживает это.

Если кто-то может пролить свет на то, где я могу что-то делать не так, я был бы очень благодарен.

1 Ответ

1 голос
/ 21 мая 2009

Проблема в том, что «WSA вызывается методом без аргументов в незащищенном веб-сервисе». Таким образом, для WSA не существует контекста безопасности для получения идентификатора пользователя из ...

Самым простым исправлением может быть изменение WSA API для принятия идентификатора пользователя в параметрах запроса.

НТН Том

...