4

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

4

2 回答 2

2

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

在 Tomcat 中,LoginModule 不是主要的身份存储类型。Realm 是,但 Tomcat 提供了一个桥梁,因此您无论如何都可以使用 LoginModule。但是正如您所发现的那样,JAAS 在 Java EE 中的使用并不是标准的。服务器要么根本不使用 JAAS,要么它们的使用方式与任何其他服务器不同。

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

  1. 验证器见https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/authenticator/package-summary.html
  2. ServerAuthModulehttps://tomcat.apache.org/tomcat-9.0-doc/config/jaspic.htmlhttp://docs.oracle.com/javaee/7/api/javax/security/auth/message/module _ /ServerAuthModule.html
于 2016-05-26T11:05:08.477 回答
2

在Jboss中,可以通过:

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

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

于 2016-05-17T09:29:34.373 回答