Problem:
Wir haben eine Spring MVC-basierte RESTful-API, die vertrauliche Informationen enthält. Die API sollte gesichert sein, es ist jedoch nicht wünschenswert, die Anmeldeinformationen des Benutzers (Benutzer / Pass-Kombination) bei jeder Anforderung zu senden. Gemäß den REST-Richtlinien (und den internen Geschäftsanforderungen) muss der Server zustandslos bleiben. Die API wird von einem anderen Server in einem Mashup-Stil verwendet.
Bedarf:
Der Client sendet eine Anfrage an
.../authenticate
(ungeschützte URL) mit Anmeldeinformationen. Der Server gibt ein sicheres Token zurück, das genügend Informationen enthält, damit der Server zukünftige Anforderungen überprüfen und zustandslos bleiben kann. Dies würde wahrscheinlich aus denselben Informationen bestehen wie das Remember-Me-Token von Spring Security .Der Client stellt nachfolgende Anforderungen an verschiedene (geschützte) URLs und hängt das zuvor erhaltene Token als Abfrageparameter (oder weniger wünschenswert als HTTP-Anforderungsheader) an.
Vom Kunden kann nicht erwartet werden, dass er Cookies speichert.
Da wir Spring bereits verwenden, sollte die Lösung Spring Security verwenden.
Wir haben unsere Köpfe gegen die Wand geschlagen, um dies zum Laufen zu bringen. Hoffentlich hat jemand da draußen dieses Problem bereits gelöst.
Wie könnten Sie angesichts des obigen Szenarios diesen besonderen Bedarf lösen?
quelle
Antworten:
Wir haben es geschafft, dass dies genau so funktioniert, wie es im OP beschrieben ist, und hoffentlich kann jemand anderes die Lösung nutzen. Folgendes haben wir getan:
Richten Sie den Sicherheitskontext folgendermaßen ein:
Wie Sie sehen können, haben wir eine benutzerdefinierte Datei erstellt
AuthenticationEntryPoint
, die im Grunde nur eine zurückgibt,401 Unauthorized
wenn die Anforderung von uns nicht in der Filterkette authentifiziert wurdeAuthenticationTokenProcessingFilter
.CustomAuthenticationEntryPoint :
AuthenticationTokenProcessingFilter :
TokenUtils
Enthält offensichtlich einen geheimen (und sehr fallspezifischen) Code und kann nicht ohne weiteres geteilt werden. Hier ist seine Schnittstelle:Das sollte Sie zu einem guten Start bringen. Viel Spaß beim Codieren. :) :)
quelle
validate(...)
Methode). Dies ist wichtig, da der Server zustandslos bleiben soll. Ich würde mir vorstellen, dass Sie diesen Ansatz verwenden könnten, ohne Spring verwenden zu müssen.Sie könnten die Digest Access-Authentifizierung in Betracht ziehen . Im Wesentlichen lautet das Protokoll wie folgt:
Die gesamte Kommunikation erfolgt über Header, was, wie jmort253 hervorhebt, im Allgemeinen sicherer ist als die Kommunikation von sensiblem Material in den URL-Parametern.
Die Digest Access-Authentifizierung wird von Spring Security unterstützt . Beachten Sie, dass Sie sich erfolgreich authentifizieren können, wenn Sie den HA1-Hash für Ihren Client haben , obwohl in den Dokumenten angegeben ist, dass Sie Zugriff auf das Klartextkennwort Ihres Clients haben müssen.
quelle
In Bezug auf Token, die Informationen enthalten, sind JSON-Web-Token ( http://jwt.io ) eine brillante Technologie. Das Hauptkonzept besteht darin, Informationselemente (Ansprüche) in das Token einzubetten und dann das gesamte Token zu signieren, damit das Validierungsende überprüfen kann, ob die Ansprüche tatsächlich vertrauenswürdig sind.
Ich verwende diese Java-Implementierung: https://bitbucket.org/b_c/jose4j/wiki/Home
Es gibt auch ein Spring-Modul (spring-security-jwt), aber ich habe nicht untersucht, was es unterstützt.
quelle
Warum verwenden Sie OAuth nicht mit JSON WebTokens?
http://projects.spring.io/spring-security-oauth/
OAuth2 ist ein standardisiertes Autorisierungsprotokoll / Framework. Gemäß der offiziellen OAuth2- Spezifikation :
Weitere Informationen finden Sie hier
quelle