2016-10-07 3 views
0

Ich lese durch die following tutorial. Die AngularJS Navigationssteuerung ausgelöst wird, wenn die Seite geladen wird, und das schließt eine beglaubigen Funktion ausführt, die wie folgt aussieht:Post-Basic-Authentifizierungssemantik mit AngularJS und Spring Boot?

Die Funktion wird wie folgt aufgerufen: authenticate()

So ohne Anmeldeinformationen oder rufen Sie zurück geführt wird , so dass die Authentifizierung beim Laden der Seite offensichtlich nicht erfolgreich ist. IIUC der Grund, warum dies so genannt wird, ist im Falle einer Browseraktualisierung nach der Anmeldung. Also meine Frage ist, wie gelingt es dieser Funktion $rootScope.authenticated zu True Post Login, seit IIUC die grundlegende Authentifizierung headers Wert mit der Ajax-Anfrage (Die Zeile $http.get('user', {headers : headers}) wird {} sein. Wird Spring einfach die Anfrage durchlassen, da der Benutzer bereits authentifiziert ist und dies geschieht, weil der Header Authentication Basic Postform-Authentifizierung festgelegt ist?

Antwort

1

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.

  1. Der Browser (die Winkel Anwendung) den Authorization Header mit gültigen Anmeldeinformationen preemptive und leitet eine HTTP-Anforderung an eine begrenzte Ressource
  2. Der Server Anmeldeinformationen Benutzer bestätigt, erstellt eine HttpSession durch eine Session-ID identifiziert und sendet es an den Browser zurück
  3. der Browser legt die Session-ID als Cookie auf jede nachfolgende HTTP-Anforderung automatisch
  4. 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.