2014-10-09 88 views
0

我是Spring Security 3.x中的新成員,所以也許我的問題很愚蠢。spring security 3.x + mvc - 異常處理

使用案例: 登錄頁面,用戶輸入錯誤的數據(例如錯誤pasword),則應該登錄頁面上顯示的一些錯誤信息

場景: 處理登錄與例如我的客戶身份驗證提供落得AuthenticationServiceException。 然後客戶再次被重定向到登錄頁面

問題: 我爲登錄操作設置了控制器@RequestMapping(value =「login」)。 我想知道異常被提出,並且我想在登錄操作中顯示一些文本(例如exception.getLocalizedMessage())。 如何? 我怎樣才能捕獲這個AuthenticationServiceException,讓控制器知道顯示的東西?

謝謝

+0

Spring Security已經爲您處理了這個問題,並且已經公開了本地化的錯誤消息。爲什麼要再次改造它?你也不想知道究竟是什麼問題(即*未知的用戶名*或*錯誤的密碼*),因爲這是黑客繼續進行的提示。你想要有一個通用的錯誤信息(如*未知的用戶名/密碼組合*)。 – 2014-10-09 14:21:44

+0

我如何訪問它?我怎樣才能意識到拋出異常?這是由春季安全處理的? – squirrelInTheBarel 2014-10-09 18:47:55

回答

0

當有一個身份驗證失敗,異常存儲在使用名稱SPRING_SECURITY_LAST_EXCEPTION模型。您可以在登錄頁上顯示的異常消息,下面的例子是從速度觀點:

#if ($SPRING_SECURITY_LAST_EXCEPTION) 
<p class="error">${SPRING_SECURITY_LAST_EXCEPTION.message}</p> 
#end 
+0

我使用類似這樣的東西:Object lastException = webRequest.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION,WebRequest.SCOPE_SESSION);什麼真的很傻。例外仍然在會話中,即使您在登錄頁面上進行刷新錯誤也是存在的。 – squirrelInTheBarel 2014-10-09 15:04:56

+0

@squirrelInTheBarel可隨意發佈您的方法作爲自己的答案。 – holmis83 2014-10-09 18:38:35

0

我用控制器如下:

Object lastException = webRequest.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION, WebRequest.SCOPE_SESSION); 
if (lastException != null) { 
    .... 
} 

然後,我必須查看在最後一個異常。但是這個整體概念有點愚蠢,例如此異常仍保留在會話中,因此每次用戶進行刷新時都會顯示該異常。 應該有更好的解決方案.....