webentwicklung-frage-antwort-db.com.de

Spring Security Token Authentifizierung - RESTful JSON Service

Ich möchte Spring Security für eine Spring MVC-Anwendung verwenden, bei der es sich ausschließlich um einen JSON-Webdienst handelt. Ich habe ein paar Nachforschungen angestellt und einige Artikel gelesen, aber nichts wirklich Vollständiges gefunden. Ich möchte, dass die Anwendung vollständig statusfrei ist und eine tokenbasierte Authentifizierung verwendet. Ich möchte nicht, dass die Spring MVC-Anwendung Formulare enthält oder Formulare zur Authentifizierung verwendet. Es sollte ausschließlich Anforderungen und Daten in JSON entgegennehmen und JSON-Antworten zurückgeben.

Es wird eine Angular JS-Clientanwendung geben, die den Benutzernamen und das Kennwort senden und das Token von der Anwendung abrufen muss, um in sequenziellen Anforderungen verwendet zu werden. Irgendwann kann es Android Clients geben, die ebenfalls auf diesen Webdienst zugreifen.

Ich gehe davon aus, dass Spring Security intern die Möglichkeit hat, ein Token einer Benutzersitzung zuzuordnen. Dies bedeutet, dass das Token XXXXXXXXXXXX der Administrator-Benutzer Bob und das Token AAAAAAAAAA der Standardbenutzer Joe ist. Ich habe jedoch nicht viel Erfahrung mit Spring Security, daher weiß ich nicht, wie das alles zusammenkommt. Ich möchte weiterhin gesicherte Anmerkungen zu Controller- und Servicemethoden verwenden können.

Gibt es eine Möglichkeit, dies in Spring Security zu erreichen?

Diese Frage scheint ein guter Anfang zu sein, aber ich bin nicht sicher, ob dies so funktionieren wird, wie ich es mir vorgestellt habe RESTful Authentication via Spring .

23
greyfox

Dies wird ein guter Anfang sein mit Spring-Rest-Boilerplate .

  1. Zum ersten Mal müssen Sie die HTTP-Basisauthentifizierung verwenden und sich dann anmelden (Benutzername/Passwort senden). Dadurch wird das Token zurückgegeben.
  2. In der nachfolgenden Anforderung verwenden Sie dieses Token zur Authentifizierung.
  3. Sie müssen der Kette einen Filter hinzufügen, der diese Authentifizierung basierend auf einem Token vornimmt.

Sie müssen sich ein Token-Format und eine Verschlüsselung dafür ausdenken. Sie müssen im Idealfall auch einen Ablauf für das Token aufbewahren. Der Ablauf kann zusammen mit dem Benutzernamen Teil des Tokens sein ein Verschlüsselungsalgorithmus Eine kryptografische Hash-Funktion wie MD5, die den Hash des gesamten Tokens abruft.

Edit : Wie von Maciej Stępyra MD5 scheint defekt zu sein und es wird empfohlen, stärkere Hash-Funktionen wie zu verwenden SHA-256.

Standardmäßig werden Sie von Spring Security zu einer Anmeldeseite weitergeleitet. Dies ist jedoch nicht sinnvoll, wenn Sie REST) verwenden. Verwenden Sie daher in config ein benutzerdefiniertes AuthenticationEntryPoint (siehe Beispiel-Github-Code).

Ich habe dieses Format für mein Token verwendet: token:username:hash:expiry

hash = MD5 (benutzername + magickey)

ablauf = aktueller_Zeitstempel + Minuten_zum_Ablauf

 <security:http realm="Protected API" use-expressions="true" auto-config="false" create-session="always" entry-point-ref="**CustomAuthenticationEntryPoint**">
        <security:custom-filter ref="**authenticationTokenProcessingFilter**" position="PRE_AUTH_FILTER" />
        <security:intercept-url pattern="/**" access="isAuthenticated()" />
 </security:http>

NB: Danke dhavaln für den Code. Ich habe dies als Referenz verwendet und eine ähnliche Sache entwickelt.

18
M4ver1k

In meinem Fall fiel es mir leichter, das org.springframework.security.web.context.SecurityContextRepository im org.springframework.security.web.context.SecurityContextPersistenceFilter mit einer Implementierung, die den SecurityContext auf mehrere Tomcat-Knoten verteilt. Der Client sendet weiterhin ein Jsessionid-ähnliches Token, aber ich kann einen einfachen Round-Robin-Lastenausgleich durchführen und muss mich nicht um die Sitzungsreplikation kümmern.

1
user2560528

"Ich möchte, dass die Anwendung vollständig zustandslos ist"

Ich würde überdenken, was Sie versuchen zu tun. Es gibt einen Grund, warum Sie keine guten Beispiele für Ihre Lösung finden: Sie können einfach keine Anwendung haben, die sowohl zustandslos als auch sicher ist. Auch wenn Sie die Token irgendwo aufbewahren, sind Sie nicht staatenlos. Auch wenn Sie die Token nicht speichern (z. B. mithilfe von JWT), müssen Sie sich vor CSRF-Angriffen schützen, wenn Benutzer in einem Webbrowser darauf zugreifen. Wenn Sie Ihren Weg gehen, sollten Sie eine Menge angepassten Sicherheitscodes schreiben (was eine schlechte Sache ist). Eine Diskussion dazu finden Sie hier: https://spring.io/blog/2015/01/12/the-login-page-angular-js-and-spring-security-part-ii

1
user64141