SpringSecurity hideUserNotFoundExceptions

Ahoob發表於2015-03-10

專案中,使用SpringSecurity使用者登入驗證時,密碼錯誤能夠正常丟擲異常,
但是使用者不存在的情況卻依然丟擲密碼錯誤的異常。

異常:總是丟擲UsernameNotFoundException異常,列印出Badcredentials。

原因:hideUserNotFoundExceptions屬性預設為ture,會隱藏使用者不存在的異常

檢視AbstractUserDetailsAuthenticationProvider的authenticate()方法
發現問題所在:hideUserNotFoundExceptions屬性預設為ture
這裡寫圖片描述

解決方案:
修改配置檔案如下

<sec:authentication-manager alias="authenticationManager">
        <sec:authentication-provider ref="daoAuthenticationProvider"> 

             <!-- <sec:password-encoder ref="passwordEncoder">

                <salt-source ref="saltSource"/>

             </sec:password-encoder> -->

        </sec:authentication-provider>

    </sec:authentication-manager>

    <!-- 加了這段才可以捕捉UsernameNotFoundException -->
    <bean id="daoAuthenticationProvider"     class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">  
      <!-- 必須實現的介面 --> 
      <property name="userDetailsService" ref="hibernateUserDetailsManager" />  
      <!-- 是否隱藏使用者沒有找到的異常,預設為true,即將不能準確地報告使用者是否存在的異常 -->  
      <property name="hideUserNotFoundExceptions" value="false"/>

   </bean>

相關文章