Mein Unternehmen hat Spring MVC evaluiert, um festzustellen, ob wir es in einem unserer nächsten Projekte verwenden sollten. Bisher liebe ich das, was ich gesehen habe, und im Moment schaue ich mir das Spring Security-Modul an, um festzustellen, ob es etwas ist, das wir verwenden können / sollten.
Unsere Sicherheitsanforderungen sind ziemlich einfach. Ein Benutzer muss lediglich einen Benutzernamen und ein Kennwort angeben können, um auf bestimmte Teile der Website zugreifen zu können (z. B. um Informationen über sein Konto zu erhalten). und es gibt eine Handvoll Seiten auf der Website (FAQs, Support usw.), auf die ein anonymer Benutzer Zugriff erhalten sollte.
In dem von mir erstellten Prototyp habe ich ein "LoginCredentials" -Objekt (das nur Benutzername und Kennwort enthält) in Session für einen authentifizierten Benutzer gespeichert. Einige der Controller überprüfen, ob sich dieses Objekt in der Sitzung befindet, um beispielsweise einen Verweis auf den angemeldeten Benutzernamen zu erhalten. Ich möchte stattdessen diese selbst entwickelte Logik durch Spring Security ersetzen, was den netten Vorteil hätte, jede Art von "Wie verfolgen wir angemeldete Benutzer?" Zu entfernen. und "Wie authentifizieren wir Benutzer?" von meinem Controller / Business Code.
Es scheint, dass Spring Security ein (pro Thread) "Kontext" -Objekt bereitstellt, um von überall in Ihrer App auf den Benutzernamen / die Hauptinformationen zugreifen zu können ...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
... was sehr unfrühlinghaft erscheint, da dieses Objekt in gewisser Weise ein (globaler) Singleton ist.
Meine Frage lautet: Wenn dies die Standardmethode für den Zugriff auf Informationen über den authentifizierten Benutzer in Spring Security ist, wie wird ein Authentifizierungsobjekt in den SecurityContext eingefügt, damit es für meine Komponententests verfügbar ist, wenn für die Komponententests eine erforderlich ist authentifizierter Nutzer?
Muss ich dies in der Initialisierungsmethode jedes Testfalls verkabeln?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
Dies scheint zu ausführlich. Gibt es einen einfacheren Weg?
Das SecurityContextHolder
Objekt selbst wirkt sehr frühlingshaft ...