2014-02-19 27 views
5

Ich möchte einen zentralen Authentifizierungs-/Autorisierungsserver mit Spring Security einrichten, von dem ich das JWT-Token abrufen kann, das ich dann für den Zugriff auf eingeschränkte Ressourcen auf einem anderen Spring Security-REST-Server verwenden kann.Spring Security JWT und Oauth2

Hier ist mein Flow:

1) HTML JS/Handy usw. Client authentifiziert auf Auth-Server das JWT Token 2) Client sendet dieses Token in HTTP-Header auf REST-Server Zugang zu gesicherten Ressourcen

zu erhalten

Ich dachte, JWT würde am besten für dieses Szenario passen, da es alle relevanten Daten enthalten kann und REST-Server vollständig zustandslos sein und das Token einfach dekodieren kann, um alle notwendigen Daten (Rolle, ClientID, E-Mail ...) auf dem REST-Server zu erhalten.

Ist Oauth2 die richtige Wahl dafür und wenn ja könnte jemand mich bitte auf die richtige Richtung zeigen? Wenn JWT nicht die richtige Wette ist, bin ich offen für andere Lösungen :) Ich sollte erwähnen, dass es in meinem Fall auch möglich ist, Client-Informationen aus der Datenbank auch auf REST-Server zu laden, aber es sollte nicht für die Authentifizierung des Benutzers verantwortlich sein (was bedeutet, keine Benutzername/Passwort-Prüfung, nur die Token-Decodierung/Validierung ...)

Antwort

3

Die Cloudfoundry UAA ist eine Open-Source-OAuth2-Identity-Management-Lösung (Apache 2), die JWT-Tokens ausgibt. Sie können sich anschauen, wie es implementiert ist, oder Sie können es entweder selbst als Server oder nur als JAR verwenden. Es implementiert eine Reihe bestehender Strategien in Spring OAuth. Es hat auch optional eine eigene Benutzerdatenbank, oder Sie können Ihre eigene implementieren. Es gibt viele Optionen und Erweiterungspunkte und viele Leute verwenden es auf verschiedene Arten (nicht alle mit Cloudfoundry), weil es als generisch entworfen wurde.

Spring OAuth 2.0 hat auch support for JWT tokens, aber es ist noch nicht freigegeben (der Großteil der Implementierung stammt aus der UAA).

Da Sie aber sagen, dass Sie undurchsichtige Tokens (und eine Datenbank lookup) nichts ausmacht, möchten Sie vielleicht nur die JDBC support in Spring OAuth 1.0 verwenden. Es wurde lange in Cloudfoundry verwendet, bevor wir zu JWT wechselten, also kann ich in der Produktion dafür bürgen.

Ob OAuth2 eine gute Wahl für Ihren Anwendungsfall ist: Sie sind in der besten Position, um das zu entscheiden. Nichts, was du bisher gesagt hast, lässt mich denken, dass es eine schlechte Idee wäre. Hier ist eine Präsentation, die ich gemacht habe, wenn es hilft (Sie können es wahrscheinlich auf YouTube im SpringSource-Kanal finden, wenn Sie so etwas mögen).

+0

Wie schwierig ist es UAA in soziale Netzwerk integriert und AJAX aktiviert SSO. Ich stelle mir vor, ich würde diese Merkmale in die UAA selbst aufnehmen.Wahrscheinlich ist oauth2 nicht für SSO gedacht, aber unterstützt es den Single Log Out Mechanismus? – beku8

+1

Nicht zu schwierig. Aber ist es das, was du brauchst? Sie möchten ein soziales Netzwerk für sso verwenden und Ihre eigenen Tokens ausgeben? Wenn dies der Fall ist, müssen Sie nur den Authentifizierungsprozess ändern. OAuth2 wurde nicht speziell für sso entwickelt, aber viele Leute benutzen es so - deshalb hat Facebook zum Beispiel/me (UAA selbst macht/user_info zum selben Zweck verfügbar). –

+0

Würde es einen Vorteil geben, einen benutzerdefinierten Code mit Federsicherheit + Feder oauth2 + Feder jwt zu schreiben, anstatt uaa zu verwenden? – user1595858

0

Alvaro Sánchez hat ein Plugin mit JWT-Kompatibilität entwickelt. http://alvarosanchez.github.io/grails-spring-security-rest/1.5.0.RC4/docs/guide/tokenStorage.html#jwt

Installieren Sie die aktuelle Version in BuildConfig.groovy:

compile ":spring-security-rest:1.5.0.RC4", { 
     excludes: 'spring-security-core' 
    } 

Sie müssen nur in Config.groovy

grails.plugin.springsecurity.rest.token.storage.jwt.secret = 'YourSecretKey' 

und legen Sie einen chainMap die geheime Wahl ändern Sicherheit mit traditionellen Modus verwaltet, getrennt von neue Ruhe Staatenlose Sicherheit.

grails.plugin.springsecurity.filterChain.chainMap = [ 
     '/yourApi/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter', // Stateless chain 
     '/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'                   // Traditional chain 
    ] 

Sie können die Berechtigung und Authentifizierung innerhalb Ihrer Anwendung mit dem Spring-Security-Core-Plugin verwalten.

Verwandte Themen