JWT (JSON Web Token) ist ein JSON-basierter Open Standard (RFC 7519), der implementiert ist, um Ansprüche zwischen Netzwerkanwendungsumgebungen zu übergeben. Das Token ist kompakt und sicher ausgestattet, insbesondere für Einzel-SSO-Szenarien von verteilten Standorten geeignet. Die JWT -Anweisung wird im Allgemeinen verwendet, um authentifizierte Benutzeridentitätsinformationen zwischen Identitätsanbietern und Dienstanbietern zu übergeben, um den Erwerb von Ressourcen aus dem Ressourcenserver zu erleichtern. Es kann auch einige zusätzliche Erklärungsinformationen hinzufügen, die für andere Geschäftslogik erforderlich sind. Das Token kann auch direkt zur Authentifizierung oder verschlüsselt werden.
Normalerweise ist es sehr riskant, die API direkt aufzudecken. Wenn Sie nichts anderes sprechen, können Sie es trinken, wenn Sie direkt von einer Maschine angegriffen werden. Im Allgemeinen muss eine bestimmte Berechtigungsstufe in die API unterteilt werden, und dann wird eine Benutzerauthentifizierung durchgeführt, und die entsprechende API wird dem Benutzer basierend auf den Authentifizierungsergebnissen gegeben. Gegenwärtig gibt es einige weitere Mainstream -Lösungen:
OAuth ist ein offener Autorisierungsstandard, mit dem Benutzer Anwendungen von Drittanbietern ermöglichen können, um auf private Ressourcen (wie Fotos, Videos) zuzugreifen, die vom Benutzer in einem Dienst gespeichert sind, ohne Benutzername und Kennwort für Anwendungen von Drittanbietern bereitzustellen.
Mit OAuth können Benutzer ein Token anstelle eines Benutzernamens und eines Kennworts bereitstellen, um auf Daten zuzugreifen, die sie in einem bestimmten Dienstanbieter speichern. Jedes Token autorisiert ein bestimmtes Drittanbieter-System (z. B. eine Videobearbeitungs-Website), um innerhalb eines bestimmten Zeitraums (z. B. innerhalb der nächsten 2 Stunden) auf eine bestimmte Ressource (z. B. nur ein Video in einem bestimmten Album) zuzugreifen. Auf diese Weise ermöglicht OAuth Benutzern, Websites von Drittanbietern zu autorisieren, um auf bestimmte spezifische Informationen zugreifen zu
Der Cookie -Authentifizierungsmechanismus besteht darin, ein Sitzungsobjekt auf dem Server für eine Authentifizierungsanforderung zu erstellen und gleichzeitig ein Cookie -Objekt im Browser des Clients zu erstellen. Das Cookie -Objekt wird zum Client gebracht, um das Sitzungsobjekt auf dem Server zu entsprechen, um die staatliche Verwaltung zu erreichen. Standardmäßig werden Cookies gelöscht, wenn wir den Browser schließen. Sie können jedoch die Auslaufzeit des Keks ändern, um den Cookie für einen bestimmten Zeitraum gültig zu machen. Die Authentifizierung basierend auf der Sitzungsmethode wird zwangsläufig einen gewissen Druck auf den Server ausüben (Speicherspeicher), nicht einfach zu erweitern (für die Behandlung von verteilten Sitzungen), Cross-Site-Anfrage-Fälschungsangriffe (CSRF)
1. Im Vergleich zur Sitzung muss es nicht auf dem Server gespeichert werden und belegt keinen Serverspeicher -Overhead.
2.. Staatelo und hoch skalierbar: Zum Beispiel gibt es 3 Maschinen (a, b, c), um einen Servercluster zu bilden. Wenn die Sitzung auf Maschine A vorhanden ist, kann die Sitzung nur auf einem der Server gespeichert werden. Zu diesem Zeitpunkt können Sie nicht auf Maschinen B und C zugreifen, da die Sitzung nicht auf B und C gespeichert ist und die Verwendung von Token die Legitimität der Anfrage des Benutzers überprüfen kann. Es ist in Ordnung für mich, ein paar weitere Maschinen hinzuzufügen, also bedeutet dies.
3..
- Die Komposition von JWT
{"iss": "jwt builder", "iat": 1416797419, "exp": 14483333419, "aud": "www.battcn.com", "sub": "[email protected] "[email protected]", "Rolle": ["Admin", "Mitglied"]}Ein JWT ist eigentlich eine Zeichenfolge, die aus drei Teilen, Header, Nutzlast und Signatur besteht (nach Abfolge im Bild oben sortiert)
JWT Token Generator: https://jwt.io/
- Anmeldeauthentifizierung
- Authentifizierungsanfrage
Ungültiges Token
Gültiges Token
Es gibt Vor- und Nachteile. Ob es anwendbar ist, sollte eher klar als Technologie und Stil berücksichtigt werden.
TokenProperties Key Mapping mit Application.yml Resource, einfach zu bedienen
@Configuration@configurationProperties (Präfix = "battcn.security.token") public class tokenProperties { / *** {@link com.battcn.security.model.token.token} Token -Expirationszeit* / private Inteheger ExpirationTim; / *** Emittent*/ private String Emittent; /*** Signatur verwendet Taste {@link com.battcn.security.model.token.token}. */ private String SigningKey; / *** {@link com.battcn.security.model.token.token} Refresh -Ablaufzeit*/ private Ganzzahl refresxptime; // set ...} Klasse von Token generiert
@ComponentPublic Class Tokenfactory {private endgültige Tokenproperties Properties; @Autowired Public TokenFactory (TokenProperties Properties) {this.Properties = Properties; } / ** * Verwenden Sie JJWT, um Token zu generieren Optional.ofnullable (context.getAuthorities ()). Orelsethrow (()-> Neue IllegalArgumentException ("Benutzer hat keine Berechtigungen"); Ansprüche Claims = jwts.claims (). SetSubject (context.getUnername ()); clinets.put ("Scopes", context.getAuthorities (). Stream (). MAP (Objekt :: toString) .Collect (tolist ()); LocalDatetime currentime = localDateTime.now (); String token = jwts.builder () .setClaims (Ansprüche) .setISSUER (Properties.getISSUer ()) .SetISSUedat (Datum.From (currentime.ATzon (zoneId.SystemDEfAULT ()). Toinstant ()) .setExpiration (Datum (currentTime.PlusMime.PlusMin) (currentTime.PlusMinTe.PlusMinute.PlusMinute.PlusMinute () (currentTime.PlusMinTen.PlusMinute () (currentTime.PlusMinTen.PlusMinute.PlusMinute.PlusMinute.PlusMinute (). .atton (zoneId.SystemDefault ()). toinstant ()) .SignWith (SignatureAlgorithm.HS512, Properties.GetSigningKey ()) .Compact (); Neue AccessToken zurückgeben (Token, Ansprüche); } / ** * erzeugen und aktualisieren aktualisieren * @param userContext * @return * / public token CreatereFreshtoken (UserContext userContext) {if (stringutils } LocalDatetime currentime = localDateTime.now (); Ansprüche Ansprüche = jwts.claims (). SetSubject (userContext.getUnername ()); Claims.put ("Scopes", Arrays.aslist (Scopes.Refresh_Token.Authority ())); String token = jwts.builder () .setClaims (Ansprüche) .setISSUER (properties.getIssuer ()) .setId (uUid.randomuuid (). ToString () .setISSUedat (Datum.Datum.From (CurrentTime.ATzone). .plusminutes (Properties.getRefresExptime ())) .ATzone (zoneId.SystemDefault ()). toinstant ()) .Signwith (SignatureAlgorithm.hs512, Eigenschaften.getSsigningKey ()) .Compact (); Neue AccessToken zurückgeben (Token, Ansprüche); }} Konfigurationsdatei, einschließlich Token -Ablaufzeit, geheimer Schlüssel, kann selbst erweitert werden
BATTCN: Sicherheit: Token: Ablaufzeit: 10 # Minuten 1440 Refresh-exp-Zeit: 30 # Minuten 2880 Emittent: http://blog.battcn.com Signing-Key: Battcn
WebSecurityConfig ist eine wichtige Konfiguration der Spring Security. In der Sicherheit können wir die gewünschten Funktionen im Grunde genommen durch Definieren von Filtern implementieren.
@Configuration@enableWebSecurityPublic Class WebSecurityConfig erweitert WebSecurityConFigurerAdapter {public static Final String token_Header_param = "X-Authorization"; public static Final String Form_Based_login_entry_point = "/api/auth/login"; public static Final String token_based_auth_entry_point = "/api/**"; public static Final String verwalten verwalten_token_based_auth_entry_point = "/verwalten/**"; public static Final String token_refresh_entry_point = "/api/auth/token"; @Autowired Private RestauthenticationEntryPoint AuthenticationEntryPoint; @Autowired Private AuthenticationsCessHandler SuccessHandler; @Autowired Private AuthenticationFailureHandler MisserersHandler; @Autowired Private LoginauthenticationProvider LoginauthenticationProvider; @Autowired Private tokenauThenticationProvider TokenauThenticationProvider; @Autowired Private Tokenextractor Tokenextractor; @Autowired Private AuthenticationManager AuthenticationManager; Protected LoginprocessingFilter BuildLoginprocessingFilter () löst Ausnahme aus {loginprocessingFilter filter = new LoginprocessingFilter (Form_Based_login_entry_Point, SuccessHandler, FailureHandler); filter.setAuthenticationManager (this.authenticationManager); Rückgabefilter; } Protected tokenauuthenticationsprozessingfilter bautenAtokenAuthentationsprozessingFilter () löst Ausnahme aus {list <string> list = lists.newarrayList (token_based_auth_entry_point, verwalten_token_based_auth_entry_point); SkippathequestMatcher -Matcher = neuer SkippathequestMatcher (Liste); TokenauThenticationprocessingFilter filter = neuer tokenauthenticationsprozessingfilter (VersagensHandler, Tokenextractor, Match); filter.setAuthenticationManager (this.authenticationManager); Rückgabefilter; } @Bean @Override public AuthenticationManager AuthenticationManagerBean () löst Ausnahme aus {return Super.authenticationManagerBean (); } @Override Protected void configure (AuthenticationManagerBuilder auth) {auth.authenticationProvider (loginauthenticationProvider); Auth.AuthenticationProvider (tokenauthenticationProvider); } @Override Protected void configure (httpecurity http) löst Ausnahme aus. . .AntMatchers (token_based_auth_entry_point) .Authenticated () // API-Endpunkte .AntMatchers (Management_Token_Based_auth_entry_Point) .hasanyrol (roleenum.admin.name () .And () .AddFilterBeforBeforte (buildloginprocessingFilter ().).). UsernamepasswordAuthenticationFilter.class) .AddFilterBefore (BuildokenAuthentication -ProcessingFilter (), usernamePasswordAuthenticationFilter.class); }}Da der JWT -Code einfach eingekapselt ist und viele Inhalte enthält, werden im Artikel nur die Hauptfragmente veröffentlicht. Wenn der vollständige Code benötigt wird, können Sie ihn direkt aus dem folgenden Git abrufen
Code dieses Kapitel
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.