我正在使用的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地址,则可以提供一种合适的解决方法。
我很困惑为什么它会通过一个协议而不是另一个协议来工作。其他人看到过这种行为或知道如何处理吗?
谢谢,
托德
最佳答案
在WebLogic中,仅为HTTP Servlet请求定义ContextHandlerCallback。
您可以通过实现ConnectionFilter/ConnectionEvent接口来访问所有协议(HTTP,RMI-IIOP等)上调用者的IP地址。您可以使用它们来记录或拒绝基于IP地址的请求。