Springsicherheit Grundlagen
In dem vorherigen Artikel "grundlegende Verwendung von Springboot + Spring Security und personalisierte Anmeldungskonfiguration" wurde die Spiniensicherheit kurz eingeführt, wodurch die Schnittstelle im Grunde genommen eingeführt und die Funktionen implementiert wurden. Dieser Artikel versucht, eine einfache Analyse des Benutzersauthentifizierungsprozesses aus der Sicht des Quellcode zu erstellen.
Vor einer spezifischen Analyse können wir zunächst die allgemeinen Prinzipien der Springsicherheit untersuchen:
Springsicherheit Grundlagen
Tatsächlich ist es relativ einfach, hauptsächlich durch eine Reihe von Filtern, die Anfrage abzufangen und zu verarbeiten.
Beschreibung des Zertifizierungsverarbeitungsprozesses
Schauen wir uns UsernamePasswordAuthenticationFilter -Klasse direkt an.
Public Class BenutzernamepasswordAuthenticationFilter erweitert die AbstractAuthentationsprozessingFilter // Anmelden zur Anfrage der Authentifizierung der Authentifizierung der öffentlichen Authentifizierung (httpServletRequest -Anfrage, httpServletRespectRection). {Neue AuthenticationServiceException ("Authentifizierungsmethode nicht unterstützt:" + request.getMethod ()); } else {// Holen Sie den Benutzer, Kennwort String username = this.obtainusername (Anfrage); String password = this.oBtainPassword (Anforderung); if (userername == null) {userername = ""; } if (password == null) {password = ""; } userername = userername.trim (); // Token generieren, usernamepasswordAuthenticationToken authRequest = new usernamePasswordAuthenticationToken (Benutzername, Passwort); this.setDetails (Anfrage, Authrequest); // Weitere überprüfen Sie die Rückgabe this.getAuthenticationManager (). Authenticate (authrequest); }}} Bei der attemptAuthentication -Methode besteht die Hauptsache darin, die Werte für Benutzername und Kennwortanforderungen zu erhalten und dann ein usernamePassWordAuthenticationToken -Objekt zur weiteren Überprüfung zu generieren.
Wir können uns jedoch zuerst die Baumethode von usernamepasswordAuthenticationToken ansehen
public usernamepasswordAuthenticationToken (Objekt -Prinzipien, Objekt -Anmeldeinformationen) {// leere Berechtigung Super ((Sammlung) NULL); this.principal = Principal; this.credentials = Anmeldeinformationen; // festlegen, ob dies.setAuthenticated (false);} Tatsächlich wird die BenutzernamepasswordAuthenticationToken von Authentication vererbt. Dieses Objekt wurde im vorherigen Artikel erwähnt. Es handelt sich um einen Parameter in der erfolgreichen Anmelde -Rückrufmethode, die Parameter wie Benutzerinformationen, Anforderungsinformationen usw. enthält.
Also mal sehen
this.getAuthenticationManager (). authenticate (authrequest);
Hier gibt es einen AuthenticationManager, aber der wahre Anruf ist ProviderManager .
public class ProviderManager implementiert AuthentifizierungManager, MessingourceaWare, Initialisierungsbean {Public Authentication Authentication (Authentifizierungsauthentifizierung) löscht die Authentifizierungsexception {Klasse <? erweitert Authentifizierung> TOTest = Authentifizierung.getClass (); AuthenticationException lastException = null; Authentifizierungsergebnis = null; boolean debug = logger.isdebugenabled (); Iterator var6 = this.getProviders (). Iterator (); while (var6.hasnext ()) {authenticationProvider provider = (authenticationProvider) var6.next (); // 1. Bestimmen Sie, ob es einen Anbieter gibt, der die Authentifizierung unterstützt, wenn (Provider.Supports (Wegest)) {// 2. True Logical Acts Ergebnis = Provider.Authenticate (Authentifizierung); }}} öffentliche Authentifizierung Authentifizierung (Authentifizierung Authentifizierung) löst die Authentifizierung aus. if (user == null) {cachewasused = false; // 1.. } try {// 2. Überprüfen Sie dies. // 3. zusätzliche Überprüfung (Kennwortprüfung) this.additionalAuthenticationChecks (Benutzer, (usernamepasswordAuthenticationToken) Authentifizierung); } catch (AuthenticationException var7) {} // 4. Die letzte Überprüfung this.PostAuthenticationChecks.Check (Benutzer); // 5. Rückgabe die reale zertifizierte Authentifizierung Return this.createSuccessAuthentication (PrincipalToreturn, Authentifizierung, Benutzer);} Die beiden Überprüfungen von Benutzerdetails hier sind hauptsächlich durch seine vier Methoden, die den Booleschen Typ zurückgeben.
Nach der Überprüfung der Informationen wird eine authentifizierte Authentifizierung durch die Konstruktionsmethode von UsernamePasswordAuthenticationToken zurückgegeben.
Nach der Erlangung der zertifizierten Authentifizierung wird SuccessHandler erneut aufgerufen. Oder wenn es die Authentifizierung fehlschlägt, rufen Sie MissertingHandler auf.
Wie Authentifizierungsergebnisse unter mehreren Anfragen geteilt werden
Überlegen wir nach dem Abschluss des Benutzersauthentifizierungsverarbeitungsprozesses, wie das Authentifizierungsergebnis zwischen mehreren Anfragen freigegeben werden kann?
Da es keine Konfiguration dafür gibt, können wir uns die Standardmethode vorstellen, um das Authentifizierungsergebnis in der Sitzung zu speichern.
Wann wird es in der Sitzung gespeichert?
Wir können weiterhin den Quellcode des Authentifizierungsprozesses betrachten. Nach der Verabschiedung der Versuch -Authentations -Methode wird eine erfolgreiche Authentifizierung aufgerufen, wenn die Authentifizierung erfolgreich ist. In dieser Methode wird nicht nur SuccessHandler aufgerufen, sondern auch eine Reihe wichtigerer Code
SecurityContextHolder.getContext (). SetAuthentication (authResult);
SecurityContexTHolder ist ein Paket für ThreadLocal. ThreadLocal ist eine Datenspeicherklasse in einem Thread. Durch sie können Daten in einem bestimmten Thread gespeichert werden. Nach der Datenspeicherung können nur die gespeicherten Daten im angegebenen Thread erhalten werden, andere Threads können jedoch keine Daten erhalten. Weitere Informationen zu den Prinzipien von ThreadLocal finden Sie in meinem vorherigen Artikel.
Im Allgemeinen werden die Anfragen und Rückgaben derselben Schnittstelle in einem Thread abgeschlossen. Wir haben den SecurityContexTHolder Authresult eingestellt und können es auch überall hin mitnehmen.
Schließlich wird das Authresult aus SecurityContextPersistenceFilter abgerufen und die Sitzung wird gespeichert.
SecurityContextPersistenceFilter ist ebenfalls ein Filter, der an der Spitze der gesamten Sicherheitsfilterkette steht, was bedeutet, dass der Filter beim Start der Überprüfung zuerst verabschiedet wird und der letzte Pass schließlich nach Abschluss der Überprüfung verabschiedet wird.
Erhalten Sie authentifizierte Benutzerinformationen
/*** Holen Sie sich den aktuell angemeldeten Benutzer* @return Complete Authentifizierung*/ @getMapPing ("/me1") public Object Currentuser () {return SecurityContextHolder.getContext (). @Return nur Benutzerdetails */@getMapPing ("/me3") öffentliches Objekt Cuurentuser (@AuthenticationPrincipal UserDetails UserDetails) {{userdetails return;}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.