2010-12-02 1 views
1

У меня есть собственный аутентификатор в Weblogic 10.3, который я использую и имею проблемы.Соединение JMX-RMI/T3 вызывает вызов CallbackHandler с использованием ContextHandlerCallback

Когда пользователь подключается и аутентифицируется по HTTP, все работает нормально. Однако, если соединение является соединением JMX-RMI/T3, вызов вызывает javax.security.auth.callback.CallbackHandler.handle. Конструктор по умолчанию ContextHandlerCallback используется и передается в массиве обратных вызовов с обратным вызовом имени пользователя и пароля. Ниже приведен код, где CallbackHandler является javax.security.auth.callback.CallbackHandler

callbacks = new Callback[2]; 
callbacks[0] = new NameCallback("username: "); 
callbacks[1] = new PasswordCallback("password: ", false); 
callbacks[2] = new ContextHandlerCallback(); 

callbackHandler.handle(callbacks); 

Здесь вершина excetption бросают в точку callbackHandler.handle(callbacks) сверху:

javax.security.auth.callback.UnsupportedCallbackException: [Security:090175]Unrecognized Callback 
at weblogic.security.SimpleCallbackHandler.handle(SimpleCallbackHandler.java:71) 
at com.bea.common.security.internal.service.CallbackHandlerWrapper.handle(CallbackHandlerWrapper.java:76) 
at weblogic.security.service.internal.WLSJAASLoginServiceImpl$CallbackHandlerWrapper.handle(WLSJAASLoginServiceImpl.java:156) 
at javax.security.auth.login.LoginContext$SecureCallbackHandler$1.run(LoginContext.java:955) 
at javax.security.auth.login.LoginContext$SecureCallbackHandler.handle(LoginContext.java:951) 

А вот еще один след исключением, что мы видя, как хорошо:

javax.security.auth.callback.UnsupportedCallbackException: Unrecognized Callback 
at weblogic.management.mbeanservers.internal.JMXAuthenticator$JMXCallbackHandler.handle(JMXAuthenticator.java:130) 
at com.bea.common.security.internal.service.CallbackHandlerWrapper.handle(CallbackHandlerWrapper.java:76) 
at weblogic.security.service.internal.WLSJAASLoginServiceImpl$CallbackHandlerWrapper.handle(WLSJAASLoginServiceImpl.java:156) 
at javax.security.auth.login.LoginContext$SecureCallbackHandler$1.run(LoginContext.java:955) 
at javax.security.auth.login.LoginContext$SecureCallbackHandler.handle(LoginContext.java:951) 

стоит отметить, что это исключение, если пользователи аутентификации через соединение JMX/T3, но HTTP работает просто отлично.

Часть того, что мы пытаемся достичь, - это сбор информации об аутентификации, такой как IP-адрес, на который был отправлен запрос, поэтому нам нужен ContextHandlerCallback. Я вижу, что попытка получить HttpServletRequest из соединения JMX-RMI/T3 может вызвать проблемы, но исключение генерируется во время javax.security.auth.callback.CallbackHandler.handle().

Другая информация, которая может быть или не быть релевантной, но почему бы не включить все, что я могу?

  • Приложение использует аутентификацию на основе форм, также как и вызовы WS, но вызов JMX-RMI/T3 может и не быть.
  • Невозможно определить, какую реализацию использовать для CallbackHandler при аутентификации. В настоящее время мы определили пользовательский LoginModule, но не пользовательский CallbackHandler.
  • Если есть доступ за пределами ContextHandlerCallback, чтобы получить доступ к IP-адресу вызывающего абонента внутри LoginModule, это обеспечит подходящее решение.

Я смущен, почему он будет работать через один протокол, а не другой. Кто-нибудь еще видел такое поведение или знает способ справиться с этим?

Спасибо, Тодд

+0

Любой шанс, что мы можем увидеть код и исключение stacktrace? – 2010-12-02 18:02:49

ответ

0

В WebLogic, то ContextHandlerCallback определяется только для HTTP сервлетов запросов.

Вы можете получить доступ к IP-адресу вызывающего абонента по всем протоколам (HTTP, RMI-IIOP, ...), реализовав интерфейсы ConnectionFilter/ConnectionEvent. Вы можете использовать их для регистрации или отклонения запросов на основе IP-адреса.