簡體   English   中英

如何在Tomcat中的Jaas登錄模塊中訪問HttpServletRequest

[英]How to acess HttpServletRequest in Jaas login module in Tomcat

我們的任務是在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。

在Jboss中,它可以通過:

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

但是PolicyContext在JACC中,Tomcat還不支持JACC。 它可能在Tomcat 9中受支持,但在Tomcat的優先級上很低。

您不必在LoginModule中獲取HttpServletRequest。 LoginModule是身份存儲的JAAS版本,它是用戶,其憑據以及可選的組或角色的數據庫/存儲庫。

在Tomcat中,LoginModule不是主要的標識存儲類型。 一個領域是,但Tomcat提供了一個橋梁,所以你無論如何都可以使用LoginModule。 但是您已經發現Java EE中JAAS的使用並不標准。 服務器根本不使用JAAS,或者使用它與任何其他服務器不同。

您正在尋找的是身份驗證機制 ,它負責與請求,響應和會話進行交互。 Tomcat有兩個接口,一個是特定於Tomcat,另一個是Java EE標准。

  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM