2014-01-15 69 views
1

Spring安全3可能會在場景後面驗證用戶密碼,但現在這成爲我的問題,我試圖攔截用戶輸入的任何密碼,找到一條線索。如何在UserDetailsS​​ervice中檢索用戶輸入的密碼

@Component("customUserDetailsService") 
public class CustomUserDetailsService implements UserDetailsService { 

............ 

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { 

     User user = userService.findByUsername(username); 

     if (user == null) { 
      throw new UsernameNotFoundException("User '"+username+"' not found !"); 
     } 

     return user; 
    } 

} 

是否有任何我可以用來截取用戶密碼的API?

+0

我不認爲'UserDetailsS​​ervice'是爲了做到這一點。 Spring安全中的另一個組件是爲了將檢索到的用戶憑證與提供的用戶憑證進行比較。 –

回答

2

UserDetailsService負責加載用戶並提供包含存儲在數據庫中的密碼的UserDetails對象。不幸的是(大多數情況下)這個密碼被散列(SHA或MD5)。

如果你想攔截由用戶輸入的密碼,那麼你有不同的選擇:

  • UserNamePasswordFilter(當您使用窗體身份驗證,如果您使用的是其他類型的認證,那麼你需要一個其他的過濾器)插入一個點來截取密碼。它負責獲取登錄http請求,創建一個UserNamePasswordAuthenticationToken並將它們轉發到AuthenticationManager

  • 另一個攔截點將是AuthenticationManager(更精確地說ProviderManager-然後只有AuthenticationManager的實際實現)。它有一個方法Authentication authenticate(Authentication authentication)稱取所述用戶輸入(的Authentication例如UsernamePasswordAuthenticationToken亞類)和verifiy(通過其轉發到一個AuthenticationProvider

  • AuthenticationProvider(例如DaoAuthenticationProvider)將是一個其他地方攔截密碼。

  • DaoAuthenticationProvider使用PasswordEncoder來散列用戶輸入的密碼。然後DaoAuthenticationProvider將比較從數據庫獲得的哈希密碼和用戶輸入的哈希密碼。 所以PasswordEncoder可能是截取用戶輸入密碼的最簡單方法!

  • 當然,您可以攔截HttpRequest本身:您可以註冊額外的SecurityFilter(在UsernamePasswordFilter之前)或簡單的Servlet過濾器(在Spring Security過濾器之前)。 (A春攔截器將無法工作,因爲Spring Security的過濾器將要處理會不會把它轉發到春節調度的要求,因此Spring調度不能調用春攔截。)

口令編碼器註冊:

<sec:authentication-manager alias="authenticationManager"> 
    <sec:authentication-provider user-service-ref="jdbcUserService"> 
     <sec:password-encoder ref="myPasswordEncoder"/> 
    </sec:authentication-provider> 
    </sec:authentication-manager> 

<beans:bean id="myPasswordEncoder"class="InterceptingPassordEncoderSubclassShaPasswordEncoder" /> 
相關問題