2017-08-29 2 views
0

Ich implementiere einen Login-Prozess mit Spring Security + Spring Session, um Login-Funktionalität für einen REST wie Backend-Service zu erstellen, der eine Sitzung erstellen/verwalten muss.Spring Security sessionID als Token-Konfiguration

Ich bin nicht sicher, ob ich die Lösung richtig anwähle, da ich einen benutzerdefinierten Endpunkt verwende, um die Sitzung manuell zu erstellen. Vielleicht muss die Sitzungserstellung in der Autorisierungsmethode selbst durchgeführt werden? Oder vielleicht gibt es eine Möglichkeit, die Sitzung nach einigen Anforderungsvalidierungen im Backend zu erstellen? Ich benutze einen benutzerdefinierten Filter und einen Provider dafür.

Auch mit meiner aktuellen Konfiguration, ich ein Problem habe, da das Back-End-API ist eine neue Sitzung mit jeder Anfrage zu schaffen, wenn es sogar 401.

Die Anforderungen dieser Lösung zurückkehren soll, ist wie folgt:

  1. Die Clients melden sich bei einem Authentifizierungs-/Autorisierungsanbieter eines Drittanbieters an. Nach der Validierung gibt der Anbieter ein Zugriffstoken aus.
  2. Die API muss das Zugriffstoken des Clients mit dem Drittanbieter überprüfen. Nach der Validierung muss die API eine Sitzung erstellen und ein neues Token (oder eine Sitzungs-ID) an die Clients zurückgeben.
  3. Zukünftige Aufrufe an die API sollten das Token (oder sessionID) in der Kopfzeile/Cookie enthalten, damit die API die Sitzung des Clients erhält.

Die große Frage ist hier: Gibt es ein gemeinsames Konzept für die Verwendung von Token basierende Authentifizierung zu einer Benutzersitzung verknüpft folgen? Wenn ja, was passiert, wenn ich benutzerdefinierte Prüfungen durchführen muss, bevor die Sitzung im Frühjahr erstellt wird, und auch benutzerdefinierte Attribute zu dieser Sitzung hinzufügen?

Mein Code befindet sich hier: https://github.com/munilvc/api-session/tree/master/src/main/java/com/munilvc/poc/security

Zum Beispiel Ausführungen einige Beispiele:

1) Führen Sie benutzerdefinierte Login:

$ curl -X POST http://localhost:8080/app-api/login/createsession -v 
> POST /app-api/login/createsession HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.49.1 
> Accept: */* 
> 
< HTTP/1.1 200 
< x-auth-token: 15a06ce8-5b34-401a-a05f-a0d933926245 
< Content-Type: application/json;charset=UTF-8 
< Transfer-Encoding: chunked 
< Date: Tue, 29 Aug 2017 01:28:24 GMT 
< 
171{"username":"username1"} 

2) Rufen Sie einen anderen Endpunkt versehen mit x-auth- Token:

HINWEIS Das x-auth-Token wird in der Antwort aktualisiert. (Bedeutet eine neue Sitzung erstellt - Das ist, was wir vermeiden wollen, geschieht dies auch, wenn Antwort ist 401)

$ curl -X GET http://localhost:8080/app-api/accounts/2 -H "x-auth-token:15a06ce8-5b34-401a-a05f-a0d933926245" -v 
> GET /app-api/accounts/2 HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.49.1 
> Accept: */* 
> x-auth-token:15a06ce8-5b34-401a-a05f-a0d933926245 
> 
< HTTP/1.1 200 
< 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 
< x-auth-token: 42a5db80-e5e1-4127-bd85-e468af4a8fb2 
< Content-Type: application/json;charset=UTF-8 
< Transfer-Encoding: chunked 
< Date: Tue, 29 Aug 2017 01:29:08 GMT 
< 
870{"id":3,"name":"Account 3"} 

PS: Ich bin nicht sicher, ob ich durfte einen Link zu dem Code in Stapeln schaffen, Überlauf. Wenn nicht, kann ich den Code auch hier einfügen.

Vielen Dank!

Antwort

0

Basierend auf Ihren Anforderungen kann OpenID Connect verwendet werden, um den Endbenutzer zu authentifizieren und einen Client zu autorisieren, der dann eine erhält. Dann kann die AccessToken verwendet werden, um die Back-End-APIs (Ressourcenserver) aufzurufen.

Werfen Sie einen Blick auf diese sample/guide zum Einrichten der Anmeldung in Spring Security 5 gegen einen externen OAuth 2.0 oder OpenID Connect-Anbieter. Dies entspricht Ihrer Anforderung, sich mit einem externen Anbieter bei der Anwendung anzumelden und eine sichere Sitzung in Spring Security zu erstellen.

Jetzt, da Sie bei der Anwendung angemeldet sind und der Client über AccessToken verfügt, kann der Client AccessToken in der Anforderung (Autorisierungsheader) zum Aufrufen der Back-End-APIs (Ressourcenserver) verwenden. Der Resource Server sollte eingerichtet werden, um die eingehenden AccessToken zu validieren. Werfen Sie einen Blick auf diese sample (master und jwt-support Filialen) zum Konfigurieren eines Ressourcenservers.

Ich würde dringend empfehlen, vertrauter mit OAuth 2.0 Authorization Framework und OpenID Connect Core 1.0.

Viel Glück!