Spring Security: recupera l’IP dell’utente, le informazioni del browser e la pagina richiesta

Utilizziamo RequestHeaderAuthenticationFilter per implementare la strategia di pre-autenticazione e PreAuthenticatedAuthenticationProvider come provider di autenticazione. Uno dei requisiti è quello di archiviare tutti i login di successo nel database con le seguenti informazioni. Poiché l’indirizzo IP dell’utente e altre informazioni relative alla richiesta non sono disponibili nella class UserDetailsService , qual è la migliore strategia per recuperare queste informazioni e archiviarle in db?

Tutte le informazioni sono disponibili tramite HttpServletRequest . Puoi ottenerlo tramite:

Iniezione di dipendenza

Il modo più semplice sarebbe iniettare la richiesta di servlet direttamente in UserDetailsService: class:

 public MyDetailsService implements UserDetailsService { @Autowired private HttpServletRequest request; //... } 

(come suggerito da OP) Ricorda di aggiungere il seguente listener al tuo web.xml :

   org.springframework.web.context.request.RequestContextListener   

AGGIORNAMENTO: Funziona poiché Spring inietta un proxy con scope speciale che implementa HttpServletRequest , quindi è ansible accedere al “bean” di richiesta con scope richiesta da MyDetailsService ambito MyDetailsService . Sotto il cofano ogni chiamata ai parametri della request viene indirizzata a org.springframework.web.context.request.RequestContextHolder#requestAttributesHolder ThreadLocal cui puoi accedere direttamente. Come puoi vedere, Spring è molto flessibile quando si tratta di regole di scoping. Funziona e basta.

RequestContextHolder

Un altro approccio consiste nell’utilizzare RequestContextHolder :

 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder. currentRequestAttributes()). getRequest(); 

Ulteriori letture:

  • La creazione di un bean Spring contiene le proprietà ServletRequest
  • Spring: come faccio ad iniettare una HttpServletRequest in un bean con scope richiesto?

Questo potrebbe essere un buon approccio:

1) Creare una class che estenda SavedRequestAwareEnuthenticationSuccessHandler

 public class MyCustomSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException { 

2) Assegna il “gestore di successo” al tuo filtro di sicurezza: