有人在 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
由于你已经完成了寻找补丁的繁重工作,最简单的“解决方法”是修补受到该错误影响的类别。
你只需要:
- 下载补丁
JNDIRealm.java
文件, - 针对你的 Tomcat 的 jar 进行编译:
javac -cp '/path/to/tomcat/lib/*:/path/to/tomcat/bin/*' JNDIRealm.java
- 将生成的类文件放入
$CATALINA_BASE/lib/org/apache/catalina/realm
。由于常见的配置了 loader 之后,类文件会覆盖catalina.jar
.