2011-01-05 21 views
0

Mit Spring Security Ich habe ein DaoAuthenticationProvider wie hier beschrieben:Spring Security userCache Ungültigkeits

http://static.springsource.org/spring-security/site/docs/2.0.x/reference/dao-provider.html

ich auch Caching haben (auch wie sie in diesem Artikel beschrieben wird).

Das Problem ist, wenn eine Anfrage kommt mit einem guten Benutzernamen (das ist bereits im Cache), aber ein schlechtes Passwort - es gibt den Benutzer aus dem Cache, als ob es ein guter Benutzername/Passwort ist. Da es den Benutzernamen als Schlüssel verwendet, ist das Passwort überhaupt nicht beteiligt.

Der genaue Code, der den Benutzer aus dem Cache zurückgibt:

UserDetails user = this.userCache.getUserFromCache(username); 

Hat jemand jemals zuvor mit diesem Problem umgegangen? Ich kann auch überprüfen, ob das Passwort das gleiche ist, aber es wäre eine benutzerdefinierte Sache.

Vielen Dank.

+0

Wird der Benutzername und das Passwort pro Anfrage gesendet? Wenn ja, ist Caching wahrscheinlich nicht sinnvoll. – Raghuram

+0

Es macht Sinn, wenn Sie DAO-Aufrufe speichern möchten. –

Antwort

2

Wenn Sie Ihre Anwendung mit den Standardkomponenten konfigurieren, soll das Szenario wie folgt:

  1. Bei Benutzeranfrag Ankunft des Authentication Objekt erstellt wird behandelt und mit Benutzername und Passwort vom Benutzer bereitgestellt.

  2. Benutzerdetails abgerufen werden sollen: wenn es möglich ist, wird UserCache zuvor zwischengespeicherten Benutzerdaten abzurufen verwendet (das heißt getUserFromCache genannt wird entweder durch Implementierungen von UserDetailsService oder AuthenticationProvidervor der Aufruf an AuthenticationManager durchgeführt wird). Und es ist 100% OK, dass die Benutzerdetails aus dem Cache mit dem guten Passwort kommen.

  3. Nach grundlegenden Vor-Authentifizierungsprüfungen (Ablauf der Anmeldeinformationen usw.) erfolgt die eigentliche Authentifizierung. An dieser Stelle wird das Passwort aus den zwischengespeicherten Benutzerdaten mit dem Passwort verglichen, das in dem Objekt Authentication gespeichert ist (das derzeit das falsche Passwort enthält). An diesem Punkt schlägt der Authentifizierungsversuch fehl. Wenn Sie jedoch

, implementieren Ihre eigenenAuthenticationProvider oder AuthenticationManager, Sie für die Kennwortüberprüfung zuständig sind.

+0

Am Ende musste ich meine eigene Passwortprüfung durchführen, da ich einen benutzerdefinierten AuthenticationProvider hatte. Vielen Dank. –

0

Was ist der Code, der den Benutzer ursprünglich aus der Datenbank holt und zwischenspeichert? Prüft es das Passwort? Klingt, als ob Sie ein Abstraktions-Problem haben - Spring Security sollte nicht wissen, woher der Benutzer kommt (DB oder Cache) und sollte die gleiche Logik verwenden.

+0

Ja, das erhält ursprünglich das Passwort und speichert das Benutzerobjekt (zusammen mit dem Passwort) zwischen. Aber wenn eine folgende Anfrage kommt, überprüft Spring, ob der Benutzer zwischengespeichert wurde, basierend auf dem Benutzernamen, wenn er im Cache ist, geht er davon aus, dass die Authentifizierung erfolgreich ist. Das ist das Problem. –