2010-10-27 3 views
1

У нас есть пользовательский javax.security.auth.spi.LoginModule, используемый для веб-сервисов, а также для некоторых веб-приложений на Weblogic 11g.Доступ к HttpServletRequest в пользовательском javax.security.auth.spi.LoginModule

Целью является запись информации о логинах при переходе через LoginModule, особенно сбойные логины. Часть желаемой информации - это IP-адрес, с которого пришел запрос аутентификации. Проблема, которую я нахожу, я не знаю, как получить эту информацию в LoginModule.

В настоящее время LoginModule просто подтверждает, что указанное имя пользователя и пароль соответствуют значениям, хранящимся в базе данных JDBC. Если аутентификация завершается с ошибкой, она увеличивает счетчик для отслеживания количества неудачных логинов для этого пользователя, если они существуют как действительный пользователь. Имя пользователя и пароль передаются, если я правильно его понимаю, через CallbackHandler, который указан во время метода initialize. Непонятно, как эти значения сначала попадают в CallbackHandler и как указать другой динамический контент, такой как исходящий IP-адрес запроса. Через отладку я обнаружил, что CallbackHandler действительно имеет запрос в следующей цепочке: handler.ch.delegate.contextHandler.requestElement, но я не вижу, как получить доступ к любому из них из интерфейса CallbackHandler.

Я исследовал некоторые из AuditProviders и т. П., Нахожу one example that logged the HTTP method, поэтому я бы предположил, что получение дополнительной информации из HTTP-запроса было бы возможно, я еще не обнаружил его. Однако мне нужно будет изменить наш пользовательский поставщик безопасности, чтобы создать аудит AuditEvent. Часть этого будет предоставлять запрос, который возвращает нас к первоначальной проблеме доступа к HttpServletRequest изнутри LoginModule.

Я пробовал реализовать ServletAuthenticationFilter как часть нашего Провайдера безопасности, но, похоже, это вызов до аутентификации, что не помогает нам в сборе неудачных попыток входа в систему.

Я относительно новичок в разработке/модификации поставщиков безопасности, поэтому основные примеры/объяснения являются лучшими.

Спасибо!

+0

Как работает ваш пользовательский LoginModul? – Horcrux7

ответ

2

Захват обработчика обратного вызова во время LoginModule.initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) и сохранение его в качестве атрибута, чтобы во время вызова LoginModule.login() мы могли передать свои обратные вызовы и обработать обработчик, получив нужные нам данные.

Мы использовали weblogic.security.auth.callback.ContextHandlerCallback и имеем javax.security.auth.callback.CallbackHandler, указанный во время инициализации, обрабатываем этот объект обратного вызова с помощью метода javax.security.auth.callback.CallbackHandler.handle(Callback[]). Затем вы можете получить доступ к запросу со следующим кодом:

ContextHandler handler = contextHandlerCallback.getContextHandler(); 
HttpServletRequest request = (HttpServletRequest)handler.getValue("com.bea.contextelement.servlet.HttpServletRequest"); 
Смежные вопросы