java如何访问Tomcat中Jaas登录模块中的HttpServletRequest
我们的任务是在Tomcat7中验证我们的应用程序,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,可能会出现潜在的问题(内存泄漏、用户信息共享等)
# 1 楼答案
您不必在LoginModule中获取HttpServletRequest。LoginModule是identity store的JAAS版本,它是用户及其凭据和可选组或角色的数据库/存储库
在Tomcat中,LoginModule不是主标识存储类型。领域是,但Tomcat提供了一个桥接器,因此您可以使用LoginModule。但是正如您所发现的,JAAS在javaee中的用法并不标准。服务器要么根本不使用JAAS,要么它们使用JAAS的方式与其他服务器不同
您需要的是身份验证机制,它负责与请求、响应和会话进行交互。Tomcat有两个接口,一个是Tomcat专用的,另一个是JavaEE标准
# 2 楼答案
在Jboss中,它可以通过:
但PolicyContext在JACC中,Tomcat还不支持JACC。它可能在Tomcat 9中得到支持,但Tomcat的优先级较低