Ich erstelle eine Webanwendung mit Spring Security, die auf Amazon EC2 läuft und die Elastic Load Balancers von Amazon verwendet. Leider unterstützt ELB keine Sticky-Sitzungen, daher muss ich sicherstellen, dass meine Anwendung ohne Sitzungen ordnungsgemäß funktioniert.
Bisher habe ich RememberMeServices so eingerichtet, dass ein Token über ein Cookie zugewiesen wird. Dies funktioniert einwandfrei, aber ich möchte, dass das Cookie mit der Browsersitzung abläuft (z. B. wenn der Browser geschlossen wird).
Ich muss mir vorstellen, dass ich nicht der erste bin, der Spring Security ohne Sitzungen verwenden möchte ... irgendwelche Vorschläge?
spring
spring-security
load-balancing
amazon-ec2
Jarrod Carlson
quelle
quelle
In Spring Securitiy 3.0 scheint es noch einfacher zu sein. Wenn Sie die Namespace-Konfiguration verwenden, können Sie einfach wie folgt vorgehen:
Oder Sie können das SecurityContextRepository als null konfigurieren, und auf diese Weise wird auch nie etwas gespeichert .
quelle
Wir haben heute 4-5 Stunden an demselben Problem gearbeitet (Einfügen eines benutzerdefinierten SecurityContextRepository in SecurityContextPersistenceFilter). Schließlich haben wir es herausgefunden. Zunächst wird in Abschnitt 8.3 von Spring Security ref. doc, es gibt eine SecurityContextPersistenceFilter-Bean-Definition
Nach dieser Definition gibt es folgende Erklärung: "Alternativ können Sie eine Nullimplementierung der SecurityContextRepository-Schnittstelle bereitstellen, die verhindert, dass der Sicherheitskontext gespeichert wird, selbst wenn während der Anforderung bereits eine Sitzung erstellt wurde."
Wir mussten unser benutzerdefiniertes SecurityContextRepository in den SecurityContextPersistenceFilter einfügen. Deshalb haben wir die obige Bean-Definition einfach mit unserem benutzerdefinierten Impl geändert und in den Sicherheitskontext gestellt.
Beim Ausführen der Anwendung haben wir die Protokolle nachverfolgt und festgestellt, dass SecurityContextPersistenceFilter nicht unser benutzerdefiniertes Impl verwendet, sondern das HttpSessionSecurityContextRepository.
Nach ein paar anderen Versuchen haben wir herausgefunden, dass wir unserem benutzerdefinierten SecurityContextRepository-Impl das Attribut "security-context-repository-ref" des Namespace "http" geben müssen. Wenn Sie den Namespace "http" verwenden und Ihr eigenes SecurityContextRepository-Impl einfügen möchten, versuchen Sie es mit dem Attribut "security-context-repository-ref".
Wenn der Namespace "http" verwendet wird, wird eine separate SecurityContextPersistenceFilter-Definition ignoriert. Wie ich oben kopiert habe, ist das Referenzdokument. sagt das nicht aus.
Bitte korrigieren Sie mich, wenn ich die Dinge falsch verstanden habe.
quelle
Schauen Sie sich die
SecurityContextPersistenceFilter
Klasse an. Es definiert, wie dasSecurityContextHolder
gefüllt wird. Standardmäßig wirdHttpSessionSecurityContextRepository
der Sicherheitskontext in einer http-Sitzung gespeichert.Ich habe diesen Mechanismus ganz einfach mit benutzerdefinierten implementiert
SecurityContextRepository
.Siehe
securityContext.xml
unten:quelle
Eigentlich
create-session="never"
heißt das nicht, völlig staatenlos zu sein. In Spring Security Issue Management gibt es dafür ein Problem .quelle
Nachdem Sie mit den zahlreichen Lösungen in dieser Antwort zu kämpfen haben, versuchen Sie, etwas zum Laufen zu bringen, wenn Sie das verwenden
<http>
Namespace-Konfiguration Laufen zu bringen, fand ich endlich einen Ansatz, der tatsächlich für meinen Anwendungsfall funktioniert. Ich benötige eigentlich nicht, dass Spring Security keine Sitzung startet (da ich die Sitzung in anderen Teilen der Anwendung verwende), sondern dass es sich überhaupt nicht an die Authentifizierung in der Sitzung "erinnert" (sie sollte erneut überprüft werden) jede Anfrage).Zunächst konnte ich nicht herausfinden, wie die oben beschriebene "Null-Implementierung" -Technik durchgeführt wird. Es war nicht klar, ob Sie das securityContextRepository auf
null
oder auf eine No-Op-Implementierung setzen sollen. Ersteres funktioniert nicht, weil einNullPointerException
nach innen geworfen wirdSecurityContextPersistenceFilter.doFilter()
. Bei der No-Op-Implementierung habe ich versucht, sie so einfach wie möglich zu implementieren:Dies funktioniert in meiner Anwendung nicht, da etwas Seltsames
ClassCastException
mit demresponse_
Typ zu tun hat .Selbst wenn ich es geschafft habe, eine Implementierung zu finden, die funktioniert (indem ich den Kontext einfach nicht in der Sitzung speichere), gibt es immer noch das Problem, wie ich das in die von der
<http>
Konfiguration erstellten Filter einfügen kann. Sie können den Filter nicht einfach an derSECURITY_CONTEXT_FILTER
Position gemäß den Dokumenten ersetzen . Der einzige Weg, wie ich mich in das einhaken konnteSecurityContextPersistenceFilter
, was unter der Decke entsteht, war, eine hässlicheApplicationContextAware
Bohne zu schreiben :Wie auch immer, zu der Lösung, die tatsächlich funktioniert, wenn auch sehr hackisch. Verwenden Sie einfach a
Filter
, das den Sitzungseintrag löscht, nach demHttpSessionSecurityContextRepository
gesucht wird, wenn es seine Sache macht:Dann in der Konfiguration:
quelle
WebSecurityConfigurerAdapter
mit "http.addFilterBefore(new SpringSecuritySessionDeletingFilter(), SecurityContextPersistenceFilter.class)
"Nur eine kurze Anmerkung: Es ist "Sitzung erstellen" statt "Sitzungen erstellen".
create-session
Steuert die Bereitschaft, mit der eine HTTP-Sitzung erstellt wird.
Wenn nicht festgelegt, wird standardmäßig "ifRequired" verwendet. Andere Optionen sind "immer" und "nie".
Die Einstellung dieses Attributs wirkt sich auf die Eigenschaften allowSessionCreation und forceEagerSessionCreation von HttpSessionContextIntegrationFilter aus. allowSessionCreation ist immer wahr, es sei denn, dieses Attribut ist auf "nie" gesetzt. forceEagerSessionCreation ist "false", sofern es nicht auf "always" gesetzt ist.
Die Standardkonfiguration ermöglicht also die Sitzungserstellung, erzwingt sie jedoch nicht. Die Ausnahme ist, wenn die gleichzeitige Sitzungssteuerung aktiviert ist und forceEagerSessionCreation auf true gesetzt wird, unabhängig davon, welche Einstellung hier vorliegt. Die Verwendung von "nie" würde dann eine Ausnahme während der Initialisierung von HttpSessionContextIntegrationFilter verursachen.
Für spezifische Details der Sitzungsnutzung gibt es eine gute Dokumentation im HttpSessionSecurityContextRepository-Javadoc.
quelle
auto-config=false
können Sie anscheinend nicht ersetzen, was sich in derSECURITY_CONTEXT_FILTER
Position befindet, durch Ihr eigenes. Ich habe versucht, es mit einerApplicationContextAware
Bohne zu deaktivieren (mit Reflektion, umsecurityContextRepository
eine Null-Implementierung zu erzwingenSessionManagementFilter
), aber ohne Würfel. Und leider kann ich nicht auf Frühjahrssicherheit 3.1 Jahre umsteigen, was bieten würdecreate-session=stateless
.