La mia azienda sta valutando Spring MVC per determinare se dovremmo utilizzarlo in uno dei nostri prossimi progetti. Finora adoro quello che ho visto e in questo momento sto dando un'occhiata al modulo Spring Security per determinare se è qualcosa che possiamo / dovremmo usare.
I nostri requisiti di sicurezza sono piuttosto basilari; un utente deve solo essere in grado di fornire un nome utente e una password per poter accedere a determinate parti del sito (ad esempio per ottenere informazioni sul proprio account); e ci sono una manciata di pagine sul sito (FAQ, Supporto, ecc.) in cui un utente anonimo dovrebbe avere accesso.
Nel prototipo che ho creato, ho archiviato un oggetto "LoginCredentials" (che contiene solo nome utente e password) in Sessione per un utente autenticato; alcuni controller controllano per vedere se questo oggetto è in sessione per ottenere un riferimento al nome utente registrato, ad esempio. Sto invece cercando di sostituire questa logica di casa con Spring Security, che avrebbe il vantaggio di rimuovere qualsiasi tipo di "come tracciamo gli utenti che hanno effettuato l'accesso?" e "come possiamo autenticare gli utenti?" dal mio controller / codice aziendale.
Sembra che Spring Security fornisca un oggetto "contestuale" (per thread) per poter accedere al nome utente / alle informazioni principali da qualsiasi punto della tua app ...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
... che sembra molto non-Spring come questo oggetto è un singleton (globale), in un certo senso.
La mia domanda è questa: se questo è il modo standard per accedere alle informazioni sull'utente autenticato in Spring Security, qual è il modo accettato per iniettare un oggetto Authentication in SecurityContext in modo che sia disponibile per i test delle mie unità quando i test delle unità richiedono un utente autenticato?
Devo collegarlo nel metodo di inizializzazione di ciascun caso di test?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
Questo sembra eccessivamente prolisso. C'è un modo più semplice?
L' SecurityContextHolder
oggetto stesso sembra molto non-Spring ...