Heim Backend-Entwicklung Golang Grundlegendes zur JWT-Authentifizierung: Architektur und Go-Implementierung von Spring Security

Grundlegendes zur JWT-Authentifizierung: Architektur und Go-Implementierung von Spring Security

Dec 01, 2024 pm 02:15 PM

Nachdem ich die zustandslose JWT-Authentifizierung (hier verfügbar) eingerichtet hatte, wollte ich verstehen, was unter den Abstraktionen von Spring Security passiert, indem ich Schlüsselkomponenten und ihre Interaktionen identifizierte. Um diese Erkundung spannender zu gestalten, habe ich mithilfe der Standard-HTTP-Bibliothek eine Minimalversion in Go neu implementiert. Indem ich drei Kernabläufe – Registrierung, Token-Generierung und Zugriff auf geschützte Ressourcen – aufschlüsselte und sie in Go neu aufbaute, wollte ich die Authentifizierungsmuster von Spring Security einfacheren Komponenten zuordnen.

Dieser Beitrag konzentriert sich speziell auf Authentifizierungsabläufe – wie das System die Benutzeridentität überprüft – und nicht auf die Autorisierung. Wir werden die Abläufe mit Sequenzdiagrammen untersuchen, die Anforderungen durch verschiedene Komponenten in der Architektur von Spring Security verfolgen.

Hauptkomponenten

Das System stellt drei Endpunkte bereit:

  1. Benutzerregistrierung: Akzeptiert Benutzernamen und Passwort von neuen Benutzern
  2. Token-Generierung (Anmeldung): Erstellt ein JWT-Token, wenn sich Benutzer erfolgreich mit gültigen Anmeldeinformationen anmelden
  3. Geschützter Zugriff: Ermöglicht authentifizierten Benutzern den Zugriff auf geschützte Ressourcen mithilfe ihres Tokens. Als Beispiel dient der getAuthenticatedUser-Endpunkt, der Profilinformationen für den authentifizierten Token-Inhaber zurückgibt

In den folgenden Abschnitten erkläre ich die Kernkomponenten jedes Ablaufs mit einem Sequenzdiagramm für jeden.

Registrierungsablauf

Understanding JWT Authentication: Spring Security

Eine Registrierungsanfrage mit Benutzername und Passwort durchläuft die Spring Security-Filterkette, wo nur minimale Verarbeitung erfolgt, da der Registrierungsendpunkt in SecurityConfiguration so konfiguriert wurde, dass keine Authentifizierung erforderlich ist. Die Anfrage wird dann durch das DispatcherServlet von Spring geleitet, das sie basierend auf dem URL-Muster an die entsprechende Methode in UserController weiterleitet. Die Anfrage erreicht den Registerendpunkt des UserControllers, wo die Benutzerinformationen zusammen mit einem gehashten Passwort gespeichert werden.

Ablauf der Token-Generierung

Understanding JWT Authentication: Spring Security

Eine Anmeldeanforderung mit Benutzername und Passwort durchläuft die Spring Security-Filterkette, wo nur minimale Verarbeitung erfolgt, da dieser Endpunkt auch so konfiguriert ist, dass in SecurityConfiguration keine Authentifizierung erforderlich ist. Die Anfrage wird über das DispatcherServlet von Spring an den Anmeldeendpunkt von UserController weitergeleitet, der an AuthenticationManager delegiert. Mithilfe der in ApplicationConfiguration definierten konfigurierten Beans überprüft AuthenticationManager die bereitgestellten Anmeldeinformationen anhand der gespeicherten. Nach erfolgreicher Authentifizierung generiert der UserController mithilfe von JwtService ein JWT-Token mit den Benutzerinformationen und Metadaten wie der Erstellungszeit, das für nachfolgende authentifizierte Anforderungen an den Client zurückgegeben wird.

Zugriffsfluss für geschützte Ressourcen

Erfolgreicher Authentifizierungsfluss (200)

Understanding JWT Authentication: Spring Security

Authentifizierungsablauf fehlgeschlagen (401)

Understanding JWT Authentication: Spring Security

Wenn eine Anfrage eintrifft, die ein JWT-Token im Authorization-Header enthält, durchläuft sie den JwtAuthenticationFilter – einen benutzerdefinierten OncePerRequestFilter – der das Token mithilfe von JwtService verarbeitet. Wenn gültig, ruft der Filter den Benutzer über den in ApplicationConfiguration konfigurierten UserDetailsService ab und legt die Authentifizierung in SecurityContextHolder fest. Wenn das Token fehlt oder ungültig ist, lässt der Filter zu, dass die Anfrage fortgesetzt wird, ohne dass die Authentifizierung festgelegt wird.

Später in der Kette prüft AuthorizationFilter, ob die Anfrage ordnungsgemäß über SecurityContextHolder authentifiziert ist. Wenn eine fehlende Authentifizierung festgestellt wird, wird eine AccessDeniedException ausgelöst. Diese Ausnahme wird von ExceptionTranslationFilter abgefangen, der prüft, ob der Benutzer anonym ist, und an den konfigurierten JwtAuthenticationEntryPoint in SecurityConfiguration delegiert, um eine 401 Unauthorized-Antwort zurückzugeben.

Wenn alle Filter erfolgreich sind, erreicht die Anfrage das DispatcherServlet von Spring, das sie an den getAuthenticatedUser-Endpunkt in UserController weiterleitet. Dieser Endpunkt ruft die authentifizierten Benutzerinformationen von SecurityContextHolder ab, die während des Filterkettenprozesses ausgefüllt wurden.

Hinweis: Spring Security nutzt ein umfangreiches Ökosystem aus Filtern und spezialisierten Komponenten, um verschiedene Sicherheitsbedenken zu bewältigen. Um den Kernauthentifizierungsablauf zu verstehen, habe ich mich nur auf die Hauptakteure bei der JWT-Token-Validierung und Benutzerauthentifizierung konzentriert.

Go-Implementierung: Komponenten zuordnen

Die Go-Implementierung bietet ähnliche Funktionalität durch eine vereinfachte Architektur, die den wichtigsten Spring Security-Komponenten zugeordnet ist:

FilterChain

  • Stellt eine Minimalversion der Filterkette von Spring Security bereit
  • Verarbeitet Filter nacheinander für jede Anfrage
  • Verwendet eine pro-Anfrage-Ketteninstanz (VirtualFilterChain) für Thread-Sicherheit

Disponent

  • Zuordnung zum DispatcherServlet von Spring
  • Leitet Anfragen nach der Sicherheitsfilterverarbeitung an entsprechende Handler weiter

Authentifizierungskontext

  • Verwendet das Kontextpaket von Go, um den Authentifizierungsstatus pro Anfrage zu speichern
  • Zuordnung zum SecurityContextHolder von Spring

JwtFilter

  • Direktes Äquivalent zum JwtAuthenticationFilter von Spring
  • Extrahiert und validiert JWT-Token
  • Füllt den Authentifizierungskontext bei erfolgreicher Validierung aus

AuthentifizierungsFilter

  • Vereinfachte Version von Springs AuthorizationFilter
  • Konzentriert sich ausschließlich auf die Authentifizierungsüberprüfung
  • Überprüft den Authentifizierungskontext und gibt 401 zurück, wenn er fehlt

JwtService

  • Ähnlich dem JwtService von Spring
  • Verwaltet die Token-Generierung und -Validierung
  • Verwendet dieselben JWT-Kernoperationen, jedoch mit einfacherer Konfiguration

Testabdeckung

Beide Implementierungen umfassen Integrationstests (auth_test.go und AuthTest.java), die wichtige Authentifizierungsszenarien überprüfen:

Registrierungsablauf

  • Erfolgreiche Benutzerregistrierung mit gültigen Zugangsdaten
  • Registrierungsversuch mit doppeltem Benutzernamen

Anmeldeablauf

  • Erfolgreiche Anmeldung mit gültigen Zugangsdaten
  • Anmeldeversuch mit nicht vorhandenem Benutzernamen
  • Anmeldeversuch mit falschem Passwort

Geschützter Ressourcenzugriff

  • Erfolgreicher Zugriff mit gültigem Token
  • Zugriffsversuch ohne Auth-Header
  • Zugriffsversuch mit ungültigem Tokenformat
  • Zugriffsversuch mit abgelaufenem Token
  • Zugriffsversuch mit gültigem Tokenformat, aber nicht vorhandenem Benutzer

Die Java-Implementierung enthält detaillierte Kommentare, die den Ablauf jedes Testszenarios durch die Filterkette von Spring Security erläutern. Dieselben Abläufe werden in der Go-Implementierung unter Verwendung gleichwertiger Komponenten repliziert.

Zusammenfassung der Reise

Ich habe mir die JWT-Authentifizierung von Spring Security angesehen, indem ich sie in Flows und Testfälle unterteilt habe. Dann habe ich diese Muster Go-Komponenten zugeordnet. Integrationstests zeigten mir, wie Anfragen durch die Filterkette und Komponenten von Spring Security fließen. Das Erstellen einfacher Versionen dieser Muster hat mir geholfen, das Design von Spring Security zu verstehen. Die Tests haben gezeigt, dass beide Implementierungen die Authentifizierung auf die gleiche Weise handhaben. Durch das Analysieren, Testen und Neuaufbauen habe ich ein tieferes Verständnis dafür gewonnen, wie die Authentifizierung von Spring Security funktioniert.

Das obige ist der detaillierte Inhalt vonGrundlegendes zur JWT-Authentifizierung: Architektur und Go-Implementierung von Spring Security. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1676
14
PHP-Tutorial
1278
29
C#-Tutorial
1257
24
Golang gegen Python: Leistung und Skalierbarkeit Golang gegen Python: Leistung und Skalierbarkeit Apr 19, 2025 am 12:18 AM

Golang ist in Bezug auf Leistung und Skalierbarkeit besser als Python. 1) Golangs Kompilierungseigenschaften und effizientes Parallelitätsmodell machen es in hohen Parallelitätsszenarien gut ab. 2) Python wird als interpretierte Sprache langsam ausgeführt, kann aber die Leistung durch Tools wie Cython optimieren.

Golang und C: Parallelität gegen Rohgeschwindigkeit Golang und C: Parallelität gegen Rohgeschwindigkeit Apr 21, 2025 am 12:16 AM

Golang ist in Gleichzeitigkeit besser als C, während C bei Rohgeschwindigkeit besser als Golang ist. 1) Golang erreicht durch Goroutine und Kanal eine effiziente Parallelität, die zum Umgang mit einer großen Anzahl von gleichzeitigen Aufgaben geeignet ist. 2) C über Compiler -Optimierung und Standardbibliothek bietet es eine hohe Leistung in der Nähe der Hardware, die für Anwendungen geeignet ist, die eine extreme Optimierung erfordern.

Erste Schritte mit Go: Ein Anfängerführer Erste Schritte mit Go: Ein Anfängerführer Apr 26, 2025 am 12:21 AM

GoisidealforBeginersandSuitableforCloudandNetWorkServicesDuetoitsSimplicity, Effizienz und Konsumfeaturen.1) InstallgoFromTheofficialwebSiteAnDverifyWith'goversion'.2) CreateAneDrunyourFirstProgramwith'gorunhello.go.go.go.

Golang gegen C: Leistung und Geschwindigkeitsvergleich Golang gegen C: Leistung und Geschwindigkeitsvergleich Apr 21, 2025 am 12:13 AM

Golang ist für schnelle Entwicklung und gleichzeitige Szenarien geeignet, und C ist für Szenarien geeignet, in denen extreme Leistung und Kontrolle auf niedriger Ebene erforderlich sind. 1) Golang verbessert die Leistung durch Müllsammlung und Parallelitätsmechanismen und eignet sich für die Entwicklung von Webdiensten mit hoher Konsequenz. 2) C erreicht die endgültige Leistung durch das manuelle Speicherverwaltung und die Compiler -Optimierung und eignet sich für eingebettete Systementwicklung.

Golang gegen Python: Schlüsselunterschiede und Ähnlichkeiten Golang gegen Python: Schlüsselunterschiede und Ähnlichkeiten Apr 17, 2025 am 12:15 AM

Golang und Python haben jeweils ihre eigenen Vorteile: Golang ist für hohe Leistung und gleichzeitige Programmierung geeignet, während Python für Datenwissenschaft und Webentwicklung geeignet ist. Golang ist bekannt für sein Parallelitätsmodell und seine effiziente Leistung, während Python für sein Ökosystem für die kurze Syntax und sein reiches Bibliothek bekannt ist.

Golang und C: Die Kompromisse bei der Leistung Golang und C: Die Kompromisse bei der Leistung Apr 17, 2025 am 12:18 AM

Die Leistungsunterschiede zwischen Golang und C spiegeln sich hauptsächlich in der Speicherverwaltung, der Kompilierungsoptimierung und der Laufzeiteffizienz wider. 1) Golangs Müllsammlung Mechanismus ist praktisch, kann jedoch die Leistung beeinflussen.

Das Performance -Rennen: Golang gegen C. Das Performance -Rennen: Golang gegen C. Apr 16, 2025 am 12:07 AM

Golang und C haben jeweils ihre eigenen Vorteile bei Leistungswettbewerben: 1) Golang ist für eine hohe Parallelität und schnelle Entwicklung geeignet, und 2) C bietet eine höhere Leistung und eine feinkörnige Kontrolle. Die Auswahl sollte auf Projektanforderungen und Teamtechnologie -Stack basieren.

Golang gegen Python: Die Vor- und Nachteile Golang gegen Python: Die Vor- und Nachteile Apr 21, 2025 am 12:17 AM

GolangissidealforbuildingsCalablesSystemduetoitseffizienz und Konsumverkehr, whilepythonexcelsinquickScriptingandDataanalyseduetoitssimplication und VacevastEcosystem.golangsDesineScouragesCouragescournations, tadelcodedeanDitsGoroutaTinoutgoroutaTinoutgoroutaTinoutsGoroutinesGoroutinesGoroutsGoroutins, t

See all articles