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