2011-09-28 48 views
3

檢測領域驗證失敗的原因,我寫爲Tomcat 7的自定義境界我把它包在被Tomcat的默認安裝中提供的鎖定境界。鎖定功能工作正常,但在我的web.xml中,我有在Tomcat中

<error-page> 
<error-code>403</error-code> 
<location>/forbidden.html</location> 
</error-page> 

這將指示任何用戶不認證的頁面。但是,如果它們被鎖定,它也會將正確認證的用戶重定向到頁面。當用戶不正確地進行身份驗證並被鎖定時,我是否可以檢測到差異?

回答

2

它看起來並不容易。我的第一個想法是對LockOutRealm進行子類化,並在用戶被鎖定的情況下向請求上下文添加一些內容,以便日後打印到用戶界面。不幸的是,它不會工作,因爲authenticate methods of the LockOutRealm剛剛獲得登錄名和密碼,並且沒有請求或上下文對象。

另一個問題是當認證失敗時authenticate方法返回null並且LockOutRealm也這樣做。 當認證失敗時,LockOutRealm的行爲與任何其他領域的行爲之間沒有區別。

一種解決方法:如果您使用的Servlet 3.0使用login method of the HttpServletRequest interface,自己實現閉鎖邏輯和檢查失敗的登錄嘗試的次數你的servlet調用HttpServletRequest.login() 之前。如果它高於限制,請不要撥打login()並打印自定義錯誤消息。

+1

謝謝!我希望有一個解決方案,而不是一個解決方法。儘管如此,你的迴應是讚賞。 – fidesachates

1

有同樣的問題。請求範圍中可能有某些內容。有與Tomcat 5.5一起使用的另一個鎖定領域的經驗,它將放入請求範圍「com.ofc.tomcat.LOGIN_FAILURE_MESSAGE」,如果不存在,那麼用戶必須被鎖定。

1

這個線程是很舊,我的答案肯定是非常延遲。但是,我將列舉一種做上述的方法。在Tomcat中,認證後提供失敗原因的自定義消息稍微複雜一些,但是可以實現。爲了達到這個目的,其中一種方法是構建一個定製的Tomcat閥門並將其添加到適當的級別(主機,引擎或上下文)。如果任何Web應用程序使用FORM驗證,Tomcat會自動將FormAuthentication閥插入處理管道。這個想法是攔截來自瀏覽器的'j_security_check'動作,並在它使用FormAuthentication Valve登陸之前做一些預驗證。在'invoke'方法中,用戶名('j_username')和密碼('j_password')作爲請求對象的明文顯示。通過這些可以檢查帳戶是否被鎖定,或者用戶需要通過直接進入領域(數據庫或LDAP等)來更改密碼等。從這個閥門,一個response.redirect()可以被髮送到適當的錯誤頁面。