Der Punkt hier ist, dass Spring Boot (in Wirklichkeit Spring Security) eine HttpSession
auf der Backend-Seite nach erfolgreicher Authentifizierung erstellt.
Tatsächlich ist das Back-End Stateful, da es Sitzungsdaten (authentifizierter Benutzer) auf der Serverseite speichert. Ein Client (hier Browser) wird durch die angegebene Session-ID identifiziert.
Der Authentifizierungsablauf sieht aus Protokollsicht so aus.
Use Case: Browser initiiert einen HTTP-Aufruf an das Backend: Backend antwortet mit Unauthorized
, da der Client auf eine geschützte Ressource ohne Authorization
Header
$ curl -I -H "X-Requested-With:XMLHttpRequest" http://localhost:8080/user
HTTP/1.1 401
Set-Cookie: XSRF-TOKEN=b1137571-5e15-491c-8df5-9db5d34f29a8;path=/
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Transfer-Encoding: chunked
Use Case zuzugreifen versucht: Preemptive Standardauthentifizierung. Backend ermöglicht den Zugriff auf Ressourcen und benachrichtigt Kunden über Session-ID
$ curl -I -H "X-Requested-With:XMLHttpRequest" -H "Authorization:Basic dXNlcjpwYXNzd29yZA==" http://localhost:8080/user
HTTP/1.1 200
Set-Cookie: XSRF-TOKEN=ef72f0b8-4262-4ea2-8a46-5f7e19558079;path=/
Set-Cookie: JSESSIONID=52B61923DE639EE339A653845FBFC5F2;path=/;HttpOnly
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type : application/json;charset=UTF-8
Content-Length: 343
Aufgrund der Tatsache, dass der Browser gültige Anmeldeinformationen über den HTTP-Header Authorization
sendet, erstellt das Backend eine neues HttpSession
und sendet eine Kennung zurück (die Session-ID) an den Browser
Set-Cookie: JSESSIONID=52B61923DE639EE339A653845FBFC5F2;path=/;HttpOnly
Nun legt der Browser auf jedem nachfolgenden HTTP
Cookie: JSESSIONID=52B61923DE639EE339A653845FBFC5F2
automatisch den
Cookie
Header aufrufen
, die einen neuen Authentifizierungszyklus verhindert. Solange die Sitzung keine Zeitüberschreitung auf der Serverseite hat, ordnet der Server die Sitzungsdaten dieser bestimmten HTTP-Anforderung zu.
Die Standardauthentifizierung ist nicht auf Spring Boot (Spring Security) oder Angular beschränkt. Es ist ein standardized authentication scheme für das Internet seit vielen Jahren.
Denken Sie daran, die grundlegende Authentifizierung ist ein altmodisches Authentifizierungsschema und hoch in modernen Web-Anwendungen entmutigt.
Wird Spring die Anfrage einfach durchlassen, da der Benutzer bereits authentifiziert wurde und dies geschieht, weil der Authentication Basic-Header die PostForm-Authentifizierung aktiviert?
In Bezug auf das zitierten Beispiel können Sie jetzt verstehen, warum ein leeres headers
Objekt zu einer Ablehnung führt nicht.
- Der Browser (die Winkel Anwendung) den
Authorization
Header mit gültigen Anmeldeinformationen preemptive und leitet eine HTTP-Anforderung an eine begrenzte Ressource
- Der Server Anmeldeinformationen Benutzer bestätigt, erstellt eine
HttpSession
durch eine Session-ID identifiziert und sendet es an den Browser zurück
- der Browser legt die Session-ID als Cookie auf jede nachfolgende HTTP-Anforderung automatisch
- der Server die HTTP-Anforderung von Sitzungs-ID identifiziert und akzeptiert die eingehende Anfrage
Was passiert, wenn Sie Spring Security anweisen, keine Sitzungen auf dem Server zu erstellen? Zu diesem Zweck wird die Nummer
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
an SecurityConfiguration::configure
angehängt.
Jetzt können Sie sehen, dass jeder Aufruf an /resource
in dem Beispiel zu einem HTTP 401 führt, da keine Sitzung auf dem Server mehr vorhanden ist. Die Angular-Anwendung ist jetzt gezwungen, den Header Authorization
für jede HTTP-Anforderung selbst festzulegen.
Der Browser kann automatisch auch Authorization
Header anhängen. Aus Gründen der Kürze werde ich diesen Teil überspringen. Bitte beachten Sie, grundlegende Authentifizierung wird dringend in modernen Web-Anwendungen abgeraten.
Die Absicht des Beispiels ist nicht, Ihnen zu zeigen, wie Sie eine Anmeldung mit Spring Boot und Angular implementieren. Die main intention ist die Entwicklung der primitiven Anmeldung in Richtung eines Single Sign-On auf OAuth2 und Spring in einer Microservice-Architektur zu entwickeln.
Nehmen Sie das Codebeispiel nicht als selbstverständlich hin.