it-swarm.com.de

Was ist der Standard-AuthenticationManager in Spring-Security? Wie authentifiziert es sich?

Ich habe folgende Bean definiert:

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

Ich denke, Spring verwendet eine Standardimplementierung von AuthenticationManager.

In meinem Java-Code habe ich:

@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;
}

Hier wird AuthenticationManager.authenticate(...) aufgerufen. Ich würde jedoch gerne wissen, welche Implementierung von AuthenticationManager Spring standardmäßig verwendet wird und was ihre authenticate(...) zur Authentifizierung macht (d. H. Sicherstellen, dass der Benutzername mit dem Kennwort übereinstimmt).

Könntest du das erklären?

47
rapt

AuthenticationManager ist eigentlich nur ein Container für Authentifizierungsanbieter, der allen eine konsistente Schnittstelle bietet. In most cases ist der Standardwert AuthenticationManager mehr als ausreichend.

Wenn du anrufst 

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

es übergeben UsernamePasswordAuthenticationToken an den Standard AuthenticationProvider, der den userDetailsService verwendet, um den Benutzer anhand des Benutzernamens abzurufen und das Kennwort des Benutzers mit dem im Authentifizierungstoken zu vergleichen.

Im Allgemeinen übergibt AuthenticationManager eine Art von AuthenticationToken an jeden von ihm AuthenticationProviders, und beide prüfen es. Wenn sie sich zur Authentifizierung verwenden können, werden sie mit der Angabe "Authentifiziert", "Nicht authentifiziert" oder "Nicht authentifizieren" angezeigt "(was bedeutet, dass der Provider nicht wusste, wie er mit dem Token umgeht, daher wurde er weitergeleitet)

Dies ist der Mechanismus, mit dem Sie andere Authentifizierungsschemas anschließen können, z. B. die Authentifizierung bei einem LDAP- oder Active Directory-Server oder OpenID. Dies ist einer der Haupterweiterungspunkte innerhalb des Spring Security-Frameworks.

59
cdeszaq

Spring Security liefert nur eine echte AuthenticationManager-Implementierung: 

org.springframework.security.authentication.ProviderManager

Dies verwendet verschiedene AuthenticationProvider für die Authentifizierungsaufgaben

AuthenticationManagerBeanDefinitionParser ist dafür verantwortlich, <sec:authentication-manager> sein Java-Dokument zu analysieren:

Registriert den zentralen ProviderManager, der vom Namespace verwendet wird Konfiguration und ermöglicht die Konfiguration eines Alias, wodurch Benutzer können in ihren Beans darauf verweisen und deutlich sehen, wo der Name ist kommen von.

Es erstellt die ProviderManager und fügt die angegebenen Angebote hinzu. Wenn in der XML-Datei keine Angebote angegeben sind, wird NullAuthenticationProvider hinzugefügt. Dies ist zumindest ein Anbieter, der nichts anderes als das Verhindern von Konfigurationsausnahmen feststellt.

31
Ralph

Von Spring Security Docs :

Die Standardimplementierung in Spring Security heißt ProviderManager. Statt die Authentifizierungsanforderung selbst zu bearbeiten, delegiert sie an eine Liste konfigurierter AuthenticationProvider - s, die jeweils abgefragt werden, um zu sehen, ob sie das ausführen kann Authentifizierung. Jeder Anbieter löst entweder eine Ausnahme aus oder gibt ein vollständig gefülltes Authentication - Objekt zurück.

Informationen zu ProviderManager finden Sie auch in Topical Guide - Spring Security Architecture :

Die am häufigsten verwendete Implementierung von AuthenticationManager ist ProviderManager, der an eine Kette von AuthenticationProvider .__ delegiert. Instanzen. Ein AuthenticationProvider ist ein bisschen wie ein AuthenticationManager, aber es hat eine zusätzliche Methode, um den Aufrufer zuzulassen abfragen, ob ein bestimmter Authentication -Typ unterstützt wird ...

0
I.Gandakov