Come autenticare manualmente l'utente con Spring Security

1. Panoramica

In questo rapido articolo, ci concentreremo su come impostare a livello di codice un utente autenticato in Spring Security e Spring MVC.

2. Spring Security

In poche parole, Spring Security conserva le informazioni principali di ogni utente autenticato in un ThreadLocal , rappresentato come un oggetto di autenticazione .

Per costruire e impostare questo oggetto di autenticazione , è necessario utilizzare lo stesso approccio che Spring Security utilizza in genere per creare l'oggetto su un'autenticazione standard.

Per, attiviamo manualmente l'autenticazione e quindi impostiamo l' oggetto di autenticazione risultante nel SecurityContext corrente utilizzato dal framework per contenere l'utente attualmente connesso:

UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth);

Dopo aver impostato l' autenticazione nel contesto, ora saremo in grado di verificare se l'utente corrente è autenticato, utilizzando securityContext.getAuthentication (). IsAuthenticated () .

3. Spring MVC

Per impostazione predefinita, Spring Security aggiunge un filtro aggiuntivo nella catena di filtri Spring Security, che è in grado di mantenere il contesto di sicurezza ( classe SecurityContextPersistenceFilter ).

A sua volta, delega la persistenza del contesto di sicurezza a un'istanza di SecurityContextRepository , per impostazione predefinita alla classe HttpSessionSecurityContextRepository .

Quindi, per impostare l'autenticazione sulla richiesta e quindi renderla disponibile per tutte le successive richieste dal client , occorre impostare manualmente il SecurityContext contenente l' Autenticazione nella sessione HTTP:

public void login(HttpServletRequest req, String user, String pass) { UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth); HttpSession session = req.getSession(true); session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc); }

SPRING_SECURITY_CONTEXT_KEY è un HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY importato staticamente .

Va notato che non possiamo usare direttamente HttpSessionSecurityContextRepository , perché funziona insieme a SecurityContextPersistenceFilter.

Questo perché il filtro utilizza il repository per caricare e memorizzare il contesto di sicurezza prima e dopo l'esecuzione del resto dei filtri definiti nella catena, ma utilizza un wrapper personalizzato sulla risposta che viene passata alla catena.

Quindi, in questo caso, dovresti conoscere il tipo di classe del wrapper utilizzato e passarlo al metodo di salvataggio appropriato nel repository.

4. Conclusione

In questo breve tutorial, abbiamo esaminato come impostare manualmente l' autenticazione dell'utente nel contesto Spring Security e come può essere resa disponibile per scopi Spring MVC, concentrandoci sugli esempi di codice che illustrano il modo più semplice per ottenerla.

Come sempre, è possibile trovare esempi di codice su GitHub.