Klassifizierung der Sicherheitsnutzung der Frühlingsverbrauch:
Ich glaube, jeder, der in Baidu gelebt hat, weiß, wie man Frühlingssicherheit nutzt. Es gibt vier Verwendungen, von einfach bis tief:
1. Es wird keine Datenbank verwendet, alle Daten werden in der Konfigurationsdatei geschrieben, die auch eine Demo im offiziellen Dokument ist.
2. Verwenden Sie die Datenbank und implementieren Sie das Standardcode -Design der Datenbank gemäß Spring Security, was bedeutet, dass die Datenbank behoben wurde, diese Methode unflexibel ist und die Datenbank sehr einfach gestaltet ist und eine schlechte Praktikabilität aufweist.
3. Frühlingssicherheit unterscheidet sich von Acegi. Es kann den Standardfilter nicht mehr ändern, aber es unterstützt das Einfügen von Filtern. Auf dieser Grundlage können wir unsere eigenen Filter für eine flexible Verwendung einfügen.
4. Gewalttätige Mittel zur Änderung des Quellcodees. Die Änderung des oben genannten Standardfilters besteht nur darin, die Konfigurationsdatei zum Ersetzen des Filters zu ändern. Dies ändert den Quellcode direkt im Inneren, dies entspricht jedoch nicht dem OO -Designprinzip und ist nicht praktisch und nicht verfügbar.
In diesem Artikel wird hauptsächlich relevante Inhalte zur Anmeldung zur benutzerdefinierten Authentifizierung von Spring Security -Authentifizierung eingeführt. Es wird für Ihre Referenz und Ihr Lernen geteilt. Ich werde unten nicht viel sagen. Schauen wir uns die detaillierte Einführung gemeinsam an.
1. Zusammenfassung
1.1. Einführung
Spring Security ist ein Sicherheitsrahmen, das auf Feder -AOP- und Servlet -Filtern basiert, um die Berechtigungsauthentifizierung usw. zu verwalten, usw.
1.2. Spring Security Custom Authentifizierungsprozess
1) Authentifizierungsprozess
Generieren Sie nicht authentifizierte Authentifizierung
↑ (Information erhalten) (Anbieter nach AuthenticationToken zuweisen) AuthenticationFilter -> AuthenticationManager -> Authentifizierungsprovider ↓ (Authentifizierung) Benutzerdetails (allgemeine Abfrage -Datenbankaufnahme) ↓ (Pass) Generate AuthenticationToken, das erfolgreich authentifiziert wurde ↓ (StoryContexTexThexThexted
2) AuthenticationFilter in die Sicherheitsfilterkette (im Ressourcenserver konfiguriert) hinzufügen, wie z. B.:
http.addFilterBefore (AuthentifizierungFilter, AbstractPreauthenticatedProcessingFilter.Class)
oder:
http.addFilterAfter (AuthentifizierungFilter, usernamepasswordAuthenticationFilter.class)
2. Nehmen Sie als Beispiel SMS Login
2.1. Entwicklungsumfeld
2.2. Kerncodeanalyse
2.2.1. Benutzerdefinierte Anmeldeauthentifizierungsprozess
2.2.1.1. Custom Authentication Login Token
/** * Mobile Login Token * * @Author: Catalpaflat */Public Class MobileloginauthenticationToken erweitert die AbstractAuthenticationToken {private statische endgültige long serialversionuid = spiningSecurityCorversion.serial_version_uid; private statische endgültige Logger logger = loggerfactory.getLogger (MobileloginauthenticationToken.class.getName ()); privates endgültiges Objekt -Schulleiter; public MobileloginauthenticationToken (String Mobile) {Super (null); this.principal = mobil; this.setAuthenticated (falsch); logger.info ("MobileloginauthenticationToken SetAuthenticated -> Falsches Laden ..."); } public MobileloginauthenticationToken (Objekt -Prinzip, Sammlung <? Erweitert GrantedAuthority> Behörden) {Super (Behörden); this.principal = Principal; // muss super verwenden, wie wir super.setAuthenticated (true) überschreiben; logger.info ("MobileloginauthenticationToken SetAuthenticated -> True Loading ..."); } @Override public void setAuthenticated (boolean authentifiziert) {if (authentifiziert) {Neue IllegalArgumentException werfen ("kann dieses Token nicht auf vertrauenswürdige Konstruktor einstellen, der stattdessen eine GrantedAuthentication -Liste nimmt"); } super.setAuthenticated (false); } @Override öffentliches Objekt getCredentials () {return null; } @Override öffentliches Objekt getPrincipal () {return this.principal; } @Override public void erasecredentials () {Super.eraseCredentials (); }} Notiz:
setAuthenticated (): Bestimmt, ob es authentifiziert wurde
2.2.1.1. Anmeldefilter für benutzerdefinierte Authentifizierung
/** * Mobile SMS -Login -Filter * * @Author: Catalpaflat */öffentliche Klasse MobileloginauthenticationFilter erweitert AbstractAuthentationsprozessingFilter {private boolean postonly = true; private statische endgültige Logger logger = loggerfactory.getLogger (MobileloginauthenticationFilter.class.getName ()); @Getter @Setter private String mobileParametername; public mobileloginauthenticationFilter (String mobileloginurl, String mobileParametername, String httpMethod) {Super (neuer AntpathequestMatcher (Mobileloginurl, httpMethod)); this.mobileparametername = MOBILEPARAMETERNAME; logger.info ("MobileloginauthenticationFilter Loading ..."); } @Override Public Authentication VersuchAuthentication (HttpServletRequest Request, HttpServletResponse -Antwort) verleiht die Authentifizierungsexception, IOException, ServletException {if (postOnly &&! Request.getMethod (). request.getMethod ()); } // Mobile String mobile = ortMobile (Anfrage) erhalten; // Token MobileloginautionToken Authrequest = Neue MobileloginhenticationToken (Mobile) zusammenstellen; // Unterklassen erlauben, die SetDetails "Details" (Request, Authrequest) festzulegen; return this.getAuthenticationManager (). authenticate (authrequest); } / *** Details zur Einstellung der Identitätsauthentifizierung* / private void setdetails (httpServletRequest -Anfrage, MobileloginauthenticationToken Authrequest) {Authrequest.SetDetails (AuthentifizierungDetailsSource.buildDetails)); } / *** Handynummer erhalten* / private String agdMobile (httpServletRequest Request) {return request.getParameter (MOBILEPARAMETERNAME); } public void setPostonly (boolean postonly) {this.postonly = postOnly; }}Hinweis: VersuchAuthentication () Methode:
2.2.1.1. Anmeldeanbieter für benutzerdefinierte Authentifizierung
/** * Mobile SMS -Login -Authentifizierungsanbieter * * @Author: Catalpaflat */Public Class MobileloginauthenticationProvider implementiert Authentifizierungsprovider {private statische logger logger logger = loggerfactory.getLogger (MobileloginautionProvider.class.getName ();); @Getter @Setter private userDetailsService CustomUserDetailsService; public mobileloginauthenticationProvider () {logger.info ("MobileloginauticationProvider Loading ..."); } /*** Authentifizierung* /@Override öffentliche Authentifizierung Authentifizierung (Authentifizierungsauthentifizierung) löst die Authentifizierung aus. // Benutzerinformationen (Datenbankauthentifizierung) userdetails userDetails = CustomUserDetailsService.loaduserByUSERNAME ((String) AuthenticationToken.getprincipal ()) abrufen; // nicht übergeben, wenn (userDetails == null) {neue interneAuthenticationServiceException werfen ("Benutzerinformationen nicht erhalten können"); } // von MobileloginauthenticationToken AuthenticationResult = new MobileloginauthenticationToken (UserDetails, userDetails.getAuthorities ()); authenticationResult.setDetails (authenticationToken.getDetails ()); Return AuthenticationResult; } / ** * Nach dem Token -Typ bestimmen Sie, welchen Anbieter zu verwenden * / @Override public boolean unterstützt (Klasse <?> Authentifizierung) {MobileloginauthenticationToken.Class.IsSignableFable (Authentifizierung); }}Hinweis: Authenticate () Methode
2.2.1.1. Benutzerdefinierte Authentifizierung Anmeldeauthentifizierungskonfiguration
@Configuration(SpringBeanNameConstant.DEFAULT_CUSTOM_MOBILE_LOGIN_AUTHENTICATION_SECURITY_CONFIG_BN)public class MobileLoginAuthenticationSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> { private static final Logger logger = Loggerfactory.getLogger (MobileloginauthenticationsCurityConfig.class.getName ()); @Value ("$ {login.mobile.url}") private String defaultMobileloginurl; @Value ("$ {login.mobile.Parameter}") private String defaultMobileloginParameter; @Value ("$ {login.mobile.httpMethod}") private String defaultMobileloginHttpMethod; @Autowired Private CustomymlConfig CustomymlConfig; @Autowired Private UserDetailsService CustomUserDetailsService; @Autowired Private AuthenticationsCessHandler CustomAuthenticationsCessHandler; @Autowired Private AuthenticationFailureHandler CustomAuthenticationFailureHandler; public mobileloginauthenticationCurityConfig () {logger.info ("MobileloginauthenticationCurityConfig -Lade ..."); } @Override public void configure (httpecurity http) löst eine Ausnahme aus {mobilepojo mobil = customYlconfig.getLogins (). GetMobile (); String url = mobil.geturl (); String parameter = mobil.getParameter (). GetMobile (); String httpMethod = mobil.gethttpMethod (); MobileloginauthenticationFilter MobileloginauthenticationFilter = New MobileloginauthenticationFilter (Stringutils.isblank (URL)? DefaultMobileloginurl: url, Stringutils.isblank (Parameter)? DefaultMobileloginurl: parametils, Stringutils.isblank (htttpMethodhod)? defaultMobileloginHttpMethod: httpMethod); MobileloginauthenticationFilter.SetAuthenticationManager (http.getSharedObject (AuthenticationManager.Class)); MobileloginauthenticationFilter.SetAuthenticationsCessHandler (CustomAuthenticationsCessHandler); MobileloginauthenticationFilter.SetAuthenticationFailureHandler (CustomAuthenticationFailureHandler); MobileloginauthenticationProvider MobileloginauthenticationProvider = New MobileloginautionProvider (); MobileloginauthenticationProvider.SetCustomUserDetailsService (CustomUserDetailsService); http.authenticationProvider (MobileloginauthenticationProvider) .AddFilterAfter (MobileloginauthenticationFilter, usernamepasswordAuthenticationFilter.class); }}Hinweis: configure () Methode
AuthentifizierungFilter und Authentifizierungsprovider instanziieren
Fügen Sie AuthenticationFilter und AuthenticationProvider zur Frühlingssicherheit hinzu.
2.2.2. Überprüfen Sie den benutzerdefinierten Verifizierungscode basierend auf Redis
2.2.2.1. Benutzerdefinierter Verifizierungscodefilter basierend auf Redis
/** * Verifizierungscode -Filter * * @Author: CatalPaflat */ @component (SpringBeannameConstant.default_validate_code_filter_bn) public class validateCodeFilter erweitert ein EinmalerRequestFilter -implements initialIntoan {private static Logger Logger Logger Logger Logger Logger = LoggerFactory.getLogger (validateCodeFilter.class.getName ()); @Autowired Private CustomymlConfig CustomymlConfig; @Autowired private redistemplate <Objekt, Objekt> redistemplate; / *** Werkzeugklasse, die überprüft, ob die angeforderte URL mit der konfigurierten URL übereinstimmt. public validateCodeFilter () {logger.info ("validateCodeFilter laden ..."); } @Override Protected void dofilterInternal (httpServletRequest -Anforderung, HttpServletResponse -Antwort, Filterchain Filterchain) löst servletException, ioException {String url = customymlconfig.getlogins (). GetMobile (). Geturl (); if (pathMatcher.match (url, request.getRequesturi ())) {String DeviceId = Request.Getheader ("DeviceID"); if (Stringutils.isblank (deviceId)) {Neue CustOMException (httpstatus.not_acceptable.Value (), "nicht Geräteid im Kopf der Anforderung"); } String codePARAMNAME = CustomyymlConfig.getLogins (). GetMobile (). GetParameter (). GetCode (); String code = request.getParameter (CodeParamName); if (Stringutils.isblank (Code)) {neue CustOMException (httpstatus.not_acceptable.Value (), "nicht Code in den Parametern der Anforderung"); } String key = systemConstant.default_mobile_key_pix + deviceId; SMSCODEPO SMSCODEPO = (SMSCODEPO) redistemplate.opsforValue (). Get (Schlüssel); if (smScodepo.isexpried ()) {neue CustOMException (httpstatus.bad_request.Value () werfen, "der Verifizierungscode ist abgelaufen"); } String smscode = smScodepo.getCode (); if (stringutils.isblank (Smscode)) {neue CustOMException (httpstatus.bad_request.Value (), "Verifizierungscode existiert nicht"); } if (stringutils.equals (code, smscode)) {redistemplate.delete (Schlüssel); // es filterChain.dofilter (Anfrage, Antwort) zu lass; } else {neue CustOMException (httpstatus.bad_request.Value (), "Validierungscode ist falsch"); }} else {// lass es filterchain.dofilter (request, Antwort); }}}Hinweis: dofilterinternal ()
Benutzerdefinierte Überprüfung des Verifizierungscode -Filters
2.2.2.2. Fügen Sie den Feder -Sicherheitsfilterkette benutzerdefinierter Bestätigungscode -Filter hinzu
http.addFilterBefore (validateCodeFilter, AbstractPreauthenticatedProcessingFilter.class)
HINWEIS: Vor dem Hinzufügen zum Authentifizierungsvorverarbeitungsfilter
3. Testen Sie den Effekt
Schließlich ist die Quellcode -Adresse beigefügt: https://gitee.com/catalpaflat/springsecurity.git (lokaler Download)
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.