Moja firma oceniała Spring MVC, aby określić, czy powinniśmy go użyć w jednym z naszych następnych projektów. Jak dotąd podoba mi się to, co widziałem, a teraz przyglądam się modułowi Spring Security, aby określić, czy jest to coś, czego możemy / powinniśmy użyć.
Nasze wymagania dotyczące bezpieczeństwa są dość podstawowe; wystarczy, że użytkownik będzie mógł podać nazwę użytkownika i hasło, aby uzyskać dostęp do niektórych części witryny (na przykład uzyskać informacje o swoim koncie); w witrynie znajduje się kilka stron (często zadawane pytania, pomoc techniczna itp.), do których anonimowy użytkownik powinien mieć dostęp.
W utworzonym przeze mnie prototypie zapisałem obiekt „LoginCredentials” (zawierający tylko nazwę użytkownika i hasło) w sesji dla uwierzytelnionego użytkownika; niektóre kontrolery sprawdzają, czy ten obiekt jest w sesji, na przykład, aby uzyskać odniesienie do nazwy zalogowanego użytkownika. Chcę zamiast tego zastąpić tę rodzimą logikę rozwiązaniem Spring Security, co przyniosłoby przyjemną korzyść w postaci usunięcia wszelkiego rodzaju „jak śledzimy zalogowanych użytkowników?” i „jak uwierzytelniamy użytkowników?” z mojego kontrolera / kodu biznesowego.
Wygląda na to, że Spring Security udostępnia obiekt „kontekstu” (dla każdego wątku), aby móc uzyskać dostęp do informacji o nazwie użytkownika / głównym z dowolnego miejsca w aplikacji ...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
... co wydaje się bardzo nie-Spring, ponieważ ten obiekt jest w pewnym sensie (globalnym) singletonem.
Moje pytanie brzmi: jeśli jest to standardowy sposób uzyskiwania dostępu do informacji o uwierzytelnionym użytkowniku w Spring Security, jaki jest akceptowany sposób wstrzyknięcia obiektu Authentication do SecurityContext, aby był dostępny dla moich testów jednostkowych, gdy testy jednostkowe wymagają Uwierzytelniony użytkownik?
Czy muszę to połączyć w metodzie inicjalizacji każdego przypadku testowego?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
Wydaje się, że jest to zbyt szczegółowe. Czy istnieje prostszy sposób?
Sam SecurityContextHolder
obiekt wydaje się bardzo nie-wiosenny ...