我们的任务是在 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。