Идентификатор клиента в jboss httpinvoker (аудит)
Я использую httpinvoker в JBoss 4.0.4 (немного старый) для вызовов EJB. Поскольку существует так много клиентов, которые делают вызовы на мой сервер, я хочу идентифицировать клиентов для каждого вызова на сервере.
Есть ли способ сделать это с помощью JBoss httpinvoker?
Я мог бы представить добавление заголовка для идентификации моего клиента в каждом HTTP-запросе, но не могу найти способ добавить заголовок в httpinvoker.
1 ответ
Аудит основывается на имени и, следовательно, на схеме аутентификации.
Поэтому я предлагаю использовать стандартную инфраструктуру аутентификации клиента для решения вашей проблемы. Это работает и для RMI (это не связано с HTTP), и идентификатор пользователя даже передается в ваши EJB.
сервер
- Поместите EJB в
security-domain
(ejb.jar: META-INF/jboss.xml) - Вы могли бы использовать
application-policy
другой, который простоUsersRolesLoginModule
(CONF / Логин-config.xml); это политика по умолчанию, она уже настроена. - Добавьте users.properties и role.properties в ваш файл ejb.jar (пакет верхнего уровня): они используются
UsersRolesLoginModule
- Для каждого пользователя добавьте его имя и (фиктивный) пароль в users.properties
клиент
- Создайте класс обратного вызова, который реализует
javax.security.auth.callback.CallbackHandler
: Этот обратный вызов используется, когда для аутентификации требуются пользователь и пароль. - Создать
javax.security.auth.login.LoginContext
; передать обработчик обратного вызова в качестве второго аргумента; вызовlogin()
по случаюLoginContext
- Обычно подключайтесь к серверу EJB, используя
InitialContext
- добавлять
-Djava.security.auth.login.config=.../jboss-4/client/auth.conf
когда вы запускаете клиент
Таким образом, идентификатор пользователя передается от клиента к EJB (как часть стандартного процесса аутентификации). Теперь в методах EJB вы можете получить идентификатор пользователя, вызвав getCallerPrincipal()
на SessionContext
пример. Я проверил это против JBoss 4.2.3
Дополнительная информация: аутентификация клиента JBoss
Приложение 1:
При использовании RMI или HTTP пароль не передается безопасным способом. В этом случае просто используйте фиктивный пароль, это нормально для аудита.
С другой стороны, если вы используете RMI по SSL или HttpInvoker по HTTPS, вы можете быстро перейти к реальной и безопасной аутентификации.
Приложение 2:
Я не уверен, работает ли он без определения ролей. Возможно, вам придется
- Добавьте строку в role.properties для каждого пользователя: например, добавьте роль подключения
- Добавьте также определения ролей в ejb-jar.xml:
security-role-ref
для каждого EJB иsecurity-role
а такжеmethod-permission
вassembly-descriptor
Обновить
Поскольку модуль входа уже существует, возможна и другая возможность:
Если у вас есть исходный код модуля входа в систему, вы можете использовать другой TextCallback
получить дополнительную информацию от клиента (в вашем случае идентификатор пользователя). Информация может быть использована для создания пользовательских Principal
, В EJB, результат getCallerPrincipal()
может быть приведен к обычному принципалу.