2012-03-20 84 views
31

我已經定義了以下豆:什麼是Spring-Security中的默認AuthenticationManager?它如何進行身份驗證?

<sec:authentication-manager alias="authenticationManager"> 
    <sec:authentication-provider 
     user-service-ref="userDetailsService" /> 
</sec:authentication-manager> 

我想在這裏Spring使用的AuthenticationManager一些默認實現。

在我的Java代碼,我有:

@Resource(name = "authenticationManager") 
private AuthenticationManager authenticationManager; // specific for Spring Security 

public boolean login(String username, String password) { 
    try { 
     Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); 
     if (authenticate.isAuthenticated()) { 
      SecurityContextHolder.getContext().setAuthentication(authenticate);    
      return true; 
     } 
    } 
    catch (AuthenticationException e) {   
    } 
    return false; 
} 

這裏AuthenticationManager.authenticate(...)被調用。但我想知道AuthenticationManager Spring的哪個實現默認使用,以及它的authenticate(...)爲了進行身份驗證(即確保用戶名與密碼匹配)。

你能解釋一下嗎?

回答

39

AuthenticationManager實際上只是認證提供程序的容器,爲它們提供了一致的界面。在大多數的情況下,默認AuthenticationManager綽綽有餘。

當你調用

.authenticate(new UsernamePasswordAuthenticationToken(username, password))` 

它傳遞UsernamePasswordAuthenticationToken到默認AuthenticationProvider,它將使用userDetailsService獲得基於用戶名的用戶,並與一個在認證令牌比較該用戶的密碼。

一般來說,AuthenticationManager通過某種AuthenticationToken到每一個它的AuthenticationProviders,他們每個檢查它,如果他們可以用它來進行身份驗證,他們與「認證」的指示返回,「未驗證」,或「無法驗證」(表示提供者不知道如何處理令牌,因此它在處理它時傳遞)

這是允許您插入其他驗證方案的機制,例如針對LDAP進行驗證或Active Directory服務器或OpenID,並且是Spring Security框架中的主要擴展點之一。

+2

這並不回答問題的最具體部分:「AuthenticationManager'接口的默認實現的名稱是什麼? @拉爾夫的回答如下。 ('org.springframework.security.authentication.ProviderManager') – 2016-03-03 15:44:33

+2

由於只有一個真正的'AuthenticationManager',我專注於問題的核心,即「認證'做什麼?」,這需要一些背景介紹如何春天放在一起。總的來說,我發現,涵蓋導致問題背景的豐富答案比回答特定問題更有用。 – cdeszaq 2016-03-07 21:40:02

20

Spring Security的船隻只有一個真正的AuthenticationManager實現:

org.springframework.security.authentication.ProviderManager 

它使用不同AuthenticationProvider的身份驗證任務

AuthenticationManagerBeanDefinitionParser負責解析<sec:authentication-manager>其Java doc的狀態:

註冊命名空間 使用的中央ProviderManager配置,並允許配置別名,允許 用戶在其bean中引用它,並清楚地看到名稱是來自哪裏的 。

它創建ProviderManager並添加指定的提供。如果在xml中沒有指定提供,那麼它將添加一個NullAuthenticationProvider。這至少是一個注意事項,而不是防止配置異常。

+0

這是正確的答案。 – smeeb 2017-12-30 15:04:53

相關問題