我们有一个用于Web服务的自定义javax.security.auth.spi.LoginModule
以及Weblogic 11g上的一些Web应用程序。
目标是在通过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 :(得分: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");