繁体   English   中英

如何在Tomcat中的Jaas登录模块中访问HttpServletRequest

[英]How to acess HttpServletRequest in Jaas login module in Tomcat

我们的任务是在Tomcat7中验证我们的应用程序,该应用程序已经过认证并在Websphere中运行。

我们在websphere中的应用程序具有JAAS自定义登录模块,它通过回调处理程序访问HttpServletRequest对象,如下所示,我们在会话对象(从请求中检索)中设置用户相关信息。

javax.security.auth.callback.Callback callbacks[] = new javax.security.auth.callback.Callback[3];
callbacks[0] = new javax.security.auth.callback.NameCallback(
            "Username: ");
callbacks[1] = new javax.security.auth.callback.PasswordCallback(
            "Password: ", false);
callbacks[2] = new com.ibm.wsspi.security.auth.callback.WSServletRequestCallback(
            "HttpServletRequest: ");

这里的问题是,如您所见,上面的代码特定于websphere。 因此,我们想要编写另一个特定于Tomcat的自定义登录模块。 对不起,这是别人设计的。

现在的问题是如何在Tomcat的Jaas登录模块中访问HttpServletRequest / HttpSession对象?

注意:我曾尝试使用ThreadLocal来传递用户信息,而不是HttpServeletRequest,但似乎不建议它,因为线程从Tomcat中的线程池重用,并且可能存在潜在问题(内存泄漏,用户信息共享等)以防万一如果我们没有正确清除ThreadLocal。

在Jboss中,它可以通过:

HttpServletRequest  request = (HttpServletRequest) PolicyContext
                        .getContext("javax.servlet.http.HttpServletRequest");

但是PolicyContext在JACC中,Tomcat还不支持JACC。 它可能在Tomcat 9中受支持,但在Tomcat的优先级上很低。

您不必在LoginModule中获取HttpServletRequest。 LoginModule是身份存储的JAAS版本,它是用户,其凭据以及可选的组或角色的数据库/存储库。

在Tomcat中,LoginModule不是主要的标识存储类型。 一个领域是,但Tomcat提供了一个桥梁,所以你无论如何都可以使用LoginModule。 但是您已经发现Java EE中JAAS的使用并不标准。 服务器根本不使用JAAS,或者使用它与任何其他服务器不同。

您正在寻找的是身份验证机制 ,它负责与请求,响应和会话进行交互。 Tomcat有两个接口,一个是特定于Tomcat,另一个是Java EE标准。

  1. 验证者请参阅https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/authenticator/package-summary.html
  2. ServerAuthModule请参阅https://tomcat.apache.org/tomcat-9.0-doc/config/jaspic.htmlhttp://docs.oracle.com/javaee/7/api/javax/security/auth/message/module /ServerAuthModule.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM