2013-05-21 47 views
0

我對臨時用戶的Oracle數據庫使用Spring身份驗證。這些用戶將被分配一個數字ID,用戶可以登錄到有限的網站。一切工作正常,但我只知道用戶將在某個時間輸入用戶名,而不是他們的數字ID(我在測試時自己做了!)。由於我認證的數據庫列是NUMBER,所以我得到一個醜陋的HTTP Status 401頁面,其中有一個SQLSyntaxErrorException,說他們輸入的是一個無效的數字(它是)。春季數據庫身份驗證異常處理?

有沒有辦法妥善處理這件事?例如,Spring有一個ExceptionMappingAuthenticationFailureHandler,允許您將各種類型的身份驗證異常映射到網頁,以便您可以將用戶重定向到一個有意義的錯誤頁面,並且我們目前正在使用BadCredentialsException之類的東西。看起來,你不能僅僅在這裏使用任何舊類型的excpetion,因爲我嘗試添加java.sql.SQLSyntaxErrorException並且它沒有改變任何東西。是否有類似的Spring類可以讓你捕捉其他類型的異常?或者我只是沒有配置正確的?這是我有什麼:

<bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler> 
    <property name="exceptionMappings"> 
     <props> 
     <!-- The Spring exception types all work fine... --> 
     <prop key="org.springframework.security.authentication.BadCredentialsException"> 
      /login/Bad Credentials 
     </prop> 
     <prop key="org.springframework.security.authentication.CredentialsExpiredException"> 
      /login/Expired Credentials 
     </prop> 
     <prop key="org.springframework.security.authentication.LockedException"> 
      /login/Account Locked 
     </prop> 
     <prop key="org.springframework.security.authentication.DisabledException"> 
      /login/Account Disabled 
     </prop> 
     <!-- ...But this one doesn't do anything! --> 
     <prop key="java.sql.SQLSyntaxErrorException"> 
      /login/Use Numeric ID 
     </prop> 
     </props> 
    </property> 
<bean> 

我真的想保持我的數據庫列定義爲一個數字。一個簡單的解決方案是將其設置爲VARCHAR,但只能將數字數據放入其中,但這有點難看。用統一的方式來處理所有的認證異常也是很好的,我們已經使用了Spring處理器。

在此先感謝!

回答

2

而不是處理與數字相比的字符串的例外,你應該在它被驗證之前處理它。可能的選項有:

  1. 修改您的登錄控制器以拒絕嘗試使用非數字用戶標識登錄。如果您在Spring Security中使用內置控制器,這可能比第二種選擇更加痛苦。

  2. 修改您的UserDetailsService以拒絕嘗試使用非數字用戶名加載用戶。如果用戶名無效,請輸入UsernameNotFoundException

  3. 拒絕純粹在客戶端登錄嘗試—這通常是一個壞主意,因爲這樣的事情真的應該發生在服務器端。我只是建議,如果修改服務器端是不可能的。僅供參考,在登錄表單提交之前,這只是一些Javascript正則表達式驗證。這應該在大多數情況下工作,但如果客戶端禁用了Javascript,它將會工作而不是

+0

非常好,謝謝!我想我可能會選擇#2,因爲現在你讓我想到了,無論如何我們還是需要更多的自定義內容。 –