Tomcat 9.0.46 的解决方法 (bug 65308) - JNDIRealm 中的 NPE

Tomcat 9.0.46 的解决方法 (bug 65308) - JNDIRealm 中的 NPE

有人在 Tomcat 9.0.46 中使用 JNDIRealm/ActiveDirectory 时遇到过 NPE 错误吗?有解决方法吗?

语境

由于并发错误,我不得不从 9.0.43 升级,当启用保持活动/重用时,套接字输入流会损坏(并混淆请求主体)。日志中充满了“解析 HTTP 请求标头时出错”和“HTTP 方法名称必须是标记 000x000x000x000x000x...”等。升级到 9.0.46 后,这个问题得到了解决,但现在我们的 ActiveDirectory 登录却坏了。

日志

17-May-2021 14:31:49.405 INFO [Catalina-tomcat-workers-thread7] org.apache.catalina.realm.JNDIRealm.authenticate Exception performing authentication. Retrying...
    java.lang.NullPointerException
            at org.apache.catalina.realm.JNDIRealm.doAttributeValueEscaping(JNDIRealm.java:2884)
            at org.apache.catalina.realm.JNDIRealm.getRoles(JNDIRealm.java:1892)
            at org.apache.catalina.realm.JNDIRealm.authenticate(JNDIRealm.java:1350)
            at org.apache.catalina.realm.JNDIRealm.authenticate(JNDIRealm.java:1232)
            at org.apache.catalina.realm.CombinedRealm.authenticate(CombinedRealm.java:191)
            at org.apache.catalina.realm.CombinedRealm.authenticate(CombinedRealm.java:191)
            at org.apache.catalina.realm.LockOutRealm.authenticate(LockOutRealm.java:154)
            at org.apache.catalina.authenticator.BasicAuthenticator.doAuthenticate(BasicAuthenticator.java:101)
            at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:632)

漏洞

根据错误报告(https://bz.apache.org/bugzilla/show_bug.cgi?id=65308)存在问题用户角色属性为空/为空。估计还要 3-4 周才会发布。

Tomcat 文档 (https://tomcat.apache.org/tomcat-9.0-doc/realm-howto.html#JNDIRealm) 表示:

roleSearch - the LDAP search filter for selecting role entries.
It optionally includes pattern replacements "{0}" for the distinguished name and/or "{1}" for the username and/or "{2}" for an attribute from user's directory entry, of the authenticated user.
Use userRoleAttribute to specify the name of the attribute that provides the value for "{2}".

我没有在 roleSearch 属性中使用“{2}”,因此不需要设置用户角色属性。尽管如此,我还是尝试将其设置为非空的值,但无济于事。

在他们发布 9.0.47 之前,我需要一个解决方法。有人愿意吗?

答案1

由于你已经完成了寻找补丁的繁重工作,最简单的“解决方法”是修补受到该错误影响的类别。

你只需要:

  1. 下载补丁JNDIRealm.java文件,
  2. 针对你的 Tomcat 的 jar 进行编译:
javac -cp '/path/to/tomcat/lib/*:/path/to/tomcat/bin/*' JNDIRealm.java
  1. 将生成的类文件放入$CATALINA_BASE/lib/org/apache/catalina/realm。由于常见的配置了 loader 之后,类文件会覆盖catalina.jar.

相关内容