JMX-RMI / T3连接导致CallbackHandler在ContextHandlerCallback存在时抛出异常

时间:2010-12-02 17:46:19

标签: java authentication weblogic jaas

我在Weblogic 10.3中有一个自定义身份验证器,我正在使用并遇到问题。

当用户通过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);

以上是从上方抛出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的原因。我可以看到尝试从JMX-RMI / T3连接中检索HttpServletRequest可能会导致问题,但在javax.security.auth.callback.CallbackHandler.handle()期间会抛出异常。

其他一些可能相关或可能不相关的信息,但为什么不包括我能做的所有?

  • 应用程序正在使用基于表单的身份验证,WS调用也是如此,但JMX-RMI / T3调用可能不会。
  • 不确定是否可以定义在进行身份验证时用于CallbackHandler的实现。目前我们已经定义了一个自定义的LoginModule,但没有定义自定义的CallbackHandler。
  • 如果在ContextHandlerCallback之外有办法访问LoginModule内部的调用者的IP地址,那么这将提供一个合适的解决方法。

我很困惑为什么它可以通过一种协议而不是另一种协议。其他人看到过这种行为或知道如何处理这个问题?

谢谢, 托德

1 个答案:

答案 0 :(得分:0)

在WebLogic中,仅为HTTP servlet请求定义ContextHandlerCallback。

您可以通过实现ConnectionFilter/ConnectionEvent接口访问所有协议(HTTP,RMI-IIOP,...)上的呼叫者的IP地址。您可以使用它们根据IP地址记录或拒绝请求。