在自定义javax.security.auth.spi.LoginModule中访问HttpServletRequest

时间:2010-10-27 16:39:19

标签: java security weblogic

我们有一个用于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作为安全提供程序的一部分实现,但似乎是在进行身份验证之前调用,这无法帮助我们捕获失败的登录尝试。

我对开发/修改安全提供程序比较陌生,因此最基本的示例/解释是最好的。

谢谢!

1 个答案:

答案 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");