有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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,可能会出现潜在的问题(内存泄漏、用户信息共享等)


共 (2) 个答案

  1. # 1 楼答案

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

    在Tomcat中,LoginModule不是主标识存储类型。领域是,但Tomcat提供了一个桥接器,因此您可以使用LoginModule。但是正如您所发现的,JAAS在javaee中的用法并不标准。服务器要么根本不使用JAAS,要么它们使用JAAS的方式与其他服务器不同

    您需要的是身份验证机制,它负责与请求、响应和会话进行交互。Tomcat有两个接口,一个是Tomcat专用的,另一个是JavaEE标准

    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
  2. # 2 楼答案

    在Jboss中,它可以通过:

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

    但PolicyContext在JACC中,Tomcat还不支持JACC。它可能在Tomcat 9中得到支持,但Tomcat的优先级较低