Implementierungsprinzip
In früheren Artikeln haben wir die Methode zur Anmeldung mit gewöhnlichen Kontokennwörtern eingeführt: Springboot + Spring Security Grundlegende Nutzung und personalisierte Anmeldekonfiguration. Aber jetzt gibt es einen weiteren gemeinsamen Weg, das sich direkt über den SMS -Verifizierungscode Ihres Mobiltelefons anmelden kann. Hier müssen Sie zusätzliche Arbeiten selbst erledigen.
Anyone who has a certain understanding of the detailed explanation of the SpringSecurity authentication process knows that in the process of account password authentication, the following categories are involved: UsernamePasswordAuthenticationFilter (used to request parameter acquisition), UsernamePasswordAuthenticationToken (represents user login information), ProviderManager (for authentication verification),
Da es über den SMS -Verifizierungscode angemeldet ist, müssen wir die angeforderten Parameter, den Authentifizierungsprozess und die Benutzeranmeldungsinformationen für einen bestimmten Betrag neu schreiben.
Natürlich sollten wir den Verifizierungscode -Prozess zuerst einsetzen, wenn der Grafikverifizierungscode gleich implementiert ist. Der Vorteil dieses Ansatzes besteht darin, dass der Verifizierungscode -Authentifizierungsprozess so entkoppelt ist, dass auch andere Schnittstellen verwendet werden können.
Grundlegende Implementierung
Überprüfung des Verifizierungscodes
Die funktionale Implementierung des SMS -Verifizierungscodes entspricht tatsächlich dem Prinzip des Grafikverifizierungscode. Es ist nur so, dass es sich um ein Bild an das Frontend zurücksetzt, und der andere ist, eine kurze Nachricht an den Benutzer zu senden. Hier müssen Sie nur die Schnittstelle des SMS -Dienstanbieters anrufen. Weitere Prinzipien finden Sie in Springboot + SpringSecurity, um die Funktion der grafischen Verifizierungscode zu implementieren.
AuthenticationToken
Wenn Sie sich mit Ihrem Kontokennwort anmelden, enthält das UsernamePassWordAuthenticationToken das Konto, das Kennwort und andere Statusinformationen des Benutzers, z. B. ob es verfügbar ist. Wir melden uns SMS auf Mobiltelefon an, sodass wir kein Passwort haben. Hier kopieren wir einfach den usernamepasswordAuthenticationToken-Code und entfernen die passwortbezogenen Informationen.
öffentliche Klasse SmscodeAthenticationToken erweitert AbstractAuthenticationToken {private statische endgültige long serialversionuid = SpringSecurityCoreVersion.Serial_version_UID; privates endgültiges Objekt -Schulleiter; public smScodeAuthenticationToken (String Mobile) {Super (null); this.principal = mobil; setAuthenticated (falsch); } public smScodeAuthenticationToken (Objekt -Prinzipie, Sammlung <? Erweitert GrantedAuthority> Behörden) {Super (Behörden); this.principal = Principal; Super.setAuthenticated (wahr); // muss super verwenden, da wir das öffentliche Objekt getCredentials () {return null; } öffentliches Objekt getPrincipal () {return this.principal; } public void setAuthenticated (boolean isauthenticated) löst illegalArgumentException aus {if (isauthenticated) {Wirf neu illegalArgumentException ("kann dieses Token nicht auf vertrauenswürdige Konstruktor einstellen, das stattdessen eine gewährte Authority -Liste aufnimmt"); } super.setAuthenticated (false); } @Override public void erasecredentials () {Super.eraseCredentials (); }} AuthentifizierungFilter
Bei der Protokollierung im Kontokennwort ist die Standardeinstellung userernamePasswordAuthenticationFilter. Seine Funktion besteht darin, das Konto und das Kennwort aus der Anforderung zu erhalten, die Anforderungsmethode zu überprüfen und eine Authentifizierung zu generieren. Hier haben sich unsere Parameter auf eine bestimmte Weise geändert, sodass es immer noch die alte Methode ist, um einfache Änderungen vorzunehmen
öffentliche Klasse SMSCODEAUTUTICATIONFILTER erweitert die AbstractAuthenticationProcessingFilter {// Parameter anfordern Key private String mobileParameter = securityConstants.default_parameter_name_mobile; // wird es nur post private boolean postonly = true unterstützt; public smScodeAuthenticationFilter () {// anfordern den URL -Super der Schnittstelle (neuer AntpathequestMatcher (SecurityConstants.default_login_processing_url_mobile, "post")); } öffentliche Authentifizierungsversuch (httpServletRequest -Anfrage, HttpServletResponse -Antwort) löst die Authentifizierung aus. } // den Anforderungswert gemäß dem Anforderungsparametername String mobile = appeMobile (Anfrage) erhalten; if (mobil == null) {mobil = ""; } mobil = mobile.trim (); // generieren Sie die entsprechende AuthentifizierungS -smscodeAthenticationToken authRequest = new smscodeAthenticationToken (mobil); SetDetails (Anfrage, Authrequest); return this.getAuthenticationManager (). authenticate (authrequest); } / *** die Handynummer erhalten* / Protected String aptMobile (httpServletRequest Request) {return request.getParameter (MobileParameter); } // irrelevante Code auslassen} Anbieter
Während des Anmeldeprozesses des Kontokennworts werden die Korrektheit des Kennworts und die Frage, ob das Konto verfügbar ist, über den DaoAuthenticationProvider überprüft. Wir sollten auch selbst einen Anbieter umsetzen
öffentliche Klasse SMSCODEAUTUTICATIONPROVIDER implementiert AuthenticationProvider {private userDetailsService userDetailsService; / ** * Identitätslogiküberprüfung * @param Authentifizierung * @return * @throws AuthenticationException */ @Override öffentliche Authentifizierung Authentifizierung (Authentifizierungsauthentifizierung) löst die Authentifizierungsexception {smscodeAthenticationToken -Authentifizierung = (smscodeAthentication) Authentifizierung; UserDetails user = userDetailsService.loadUserByUnername ((String) AuthentifizierungToken.getprincipal ()); if (user == null) {neue interneAuthenticationsserviceException werfen ("Benutzerinformationen können nicht erhalten werden"); } SmscodeAthenticationToken AuthenticationResult = new SmscodeAthenticationToken (user.getAuthitorities ()); authenticationResult.setDetails (authenticationToken.getDetails ()); Return AuthenticationResult; } @Override public boolean Supports (Klasse <?> Authentifizierung) {return smscodeAthenticationToken.class.IsScasssignableFrom (Authentifizierung); } public userDetailsService getUserDetailsService () {{userDetailsService zurückgeben; } public void setUserDetailsService (userDetailsService userdetailsService) {this.userDetailsService = userDetailsService; }} Konfiguration
Der Hauptauthentifizierungsprozess wird durch die oben genannten vier Prozesse erreicht. Hier können wir ihre Konfiguration reduzieren.
@ComponentPublic Class SmScodeAuthenticationsCurityConfig erweitert SecurityConFigurerAdapter. @Autowired Private AuthenticationFailureHandler MyAuthenticationFailureHandler; @Autowired Private UserDetailsService UserDetailsService; @Override public void configure (httpecurity http) löst Ausnahme aus {smscodeAthenticationFilter smscodeAthenticationFilter = new SmscodeAuthenticationFilter (); SMSCODEAUTHenticationFilter.SetAuthenticationManager (http.getSharedObject (AuthenticationManager.Class)); SMSCODEAUTHENTICATIONFILTER.SETAUTHENTICATIONSUCCESHANTLER (MyAuthenticationsCessHandler); SMSCODEAUTHenticationFilter.SetAuthenticationFailureHandler (MyAuthenticationFailureHandler); SMSCODEAUTHENTICATIONPROVIDER SMSCODEAUTHENTICATIONPROVIDER = NEW SMSCODEAUTHENTICATIONPROVIDER (); SMSCODEAUTHENTICATIONPROVIDER.SETUSERDETAILSService (UserDetailsService); http.authenticationProvider (smScodeAuthenticationProvider) .AddFilterAfter (SmscodeAthenticationFilter, usernamepasswordAuthenticationFilter.class); }} // BrowerSecurityConfig.java@overrideProtected void configure (httpecurity http) löst die Ausnahme aus {http.apply (smscodeAuthenticationCurityConfig);};};}; Code herunterladen
Frühlingssicherheit
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.