2010-10-27 48 views
1

我们有一个自定义的javax.security.auth.spi.LoginModule用于Web服务以及Weblogic 11g上的一些Web应用程序。在自定义javax.security.auth.spi.LoginModule中访问HttpServletRequest

目标是在通过LoginModule时记录关于登录的信息,尤其是失败的登录信息。部分所需信息是认证请求来自的IP地址。我发现的问题是我不知道如何将这些信息放入LoginModule

当前LoginModule只是验证指定的用户名和密码是否与存储在JDBC数据库中的值匹配。如果身份验证失败,则增加一个计数器以跟踪该用户的失败登录次数,如果它们作为有效用户存在的话。如果我理解正确,通过在initialize方法中指定的CallbackHandler传入用户名和密码。我不清楚这些值首先是如何进入CallbackHandler以及如何指定其他动态内容,例如请求的始发IP地址。通过调试,我发现CallbackHandler确实在下面的链中有请求:handler.ch.delegate.contextHandler.requestElement但我不知道如何访问CallbackHandler接口中的任何接口。

我研究了一些AuditProviders等,发现one example that logged the HTTP method,所以我会想象从HTTP请求获得额外的信息将是可能的,我还没有发现它。但是,我将不得不修改我们的自定义安全提供程序以创建要审计的AuditEvent。其中一部分将提供请求,这使我们回到从LoginModule内访问HttpServletRequest的初始问题。

我试图实现一个ServletAuthenticationFilter作为我们的安全提供程序的一部分,但它似乎是调用BEFORE身份验证,这不会帮助我们捕获失败的登录尝试。

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

谢谢!

+0

您的自定义LoginModul如何工作? – Horcrux7 2010-10-27 20:15:20

回答

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