Active-Directory
Tomcat 9.0.46 的解決方法(錯誤 65308) - JNDIRealm 中的 NPE
在 Tomcat 9.0.46 中使用 JNDIRealm/ActiveDirectory 時有人遇到過 NPE 錯誤並有解決方法嗎?
語境
我不得不從 9.0.43 升級,因為在啟用 keep-alive/re-use 時套接字輸入流被損壞(並混淆了請求主體)的並發錯誤。日誌中充滿了“解析 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),userRoleAttribute為空/null存在問題。估計再過 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}”,所以我不需要設置userRoleAttribute。儘管如此,我還是嘗試將其設置為非空,但無濟於事。
在他們發布 9.0.47 之前,我需要一個解決方法。有接盤俠嗎?
由於您已經完成了尋找更新檔的繁重工作,因此最簡單的*“解決方法”*是修補受該錯誤影響的類。
你只需要:
- 下載更新檔
JNDIRealm.java
文件,- 針對 Tomcat 的 jar 編譯它:
javac -cp '/path/to/tomcat/lib/*:/path/to/tomcat/bin/*' JNDIRealm.java
- 將生成的類文件放入
$CATALINA_BASE/lib/org/apache/catalina/realm
. 由於通用載入器的配置方式,類文件將覆蓋catalina.jar
.