Comment puis-je avoir la liste de tous les utilisateurs connectés (via la sécurité du spring) à mon application Web?

J’utilise la sécurité Spring dans mon application Web et je souhaite maintenant avoir une liste de tous les utilisateurs connectés à mon programme.

Comment puis-je avoir access à cette liste? Ne sont-ils pas déjà gardés quelque part dans le cadre du spring? Comme SecurityContextHolder ou SecurityContextRepository ?

Pour accéder à la liste de tous les utilisateurs connectés, vous devez injecter l’instance de SessionRegistry dans votre bean.

@Autowired @Qualifier("sessionRegistry") private SessionRegistry sessionRegistry; 

Et puis, en utilisant SessionRegistry, vous pouvez accéder à la liste de tous les principaux:

 List principals = sessionRegistry.getAllPrincipals(); List usersNamesList = new ArrayList(); for (Object principal: principals) { if (principal instanceof User) { usersNamesList.add(((User) principal).getUsername()); } } 

Mais avant d’injecter le registre de session, vous devez définir la partie gestion de session dans votre fichier spring-security.xml (consultez la section Gestion de session dans la documentation de référence de Spring Security ) et dans la section contrôle de concurrence, définissez l’alias du registre de session. alias ) par lequel vous allez l’injecter.

      ...  

Dans JavaConfig, cela ressemblerait à ceci:

 @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(final HttpSecurity http) throws Exception { // ... http.sessionManagement().maximumSessions(1).sessionRegistry(sessionRegistry()); } @Bean public SessionRegistry sessionRegistry() { return new SessionRegistryImpl(); } @Bean public ServletListenerRegistrationBean httpSessionEventPublisher() { return new ServletListenerRegistrationBean(new HttpSessionEventPublisher()); } } 

Avec le code d’appel ressemblant à ceci:

 public class UserController { @Autowired private SessionRegistry sessionRegistry; public void listLoggedInUsers() { final List allPrincipals = sessionRegistry.getAllPrincipals(); for(final Object principal : allPrincipals) { if(principal instanceof SecurityUser) { final SecurityUser user = (SecurityUser) principal; // Do something with user System.out.println(user); } } } } 

Notez que SecurityUser est ma propre classe qui implémente UserDetails .

Corrigez-moi si j’ai tort, s’il-vous plait.

Je pense que la réponse de @ Adam est incomplète. J’ai remarqué que les sessions déjà expirées dans la liste réapparaissaient.

 public class UserController { @Autowired private SessionRegistry sessionRegistry; public void listLoggedInUsers() { final List allPrincipals = sessionRegistry.getAllPrincipals(); for (final Object principal : allPrincipals) { if (principal instanceof SecurityUser) { final SecurityUser user = (SecurityUser) principal; List activeUserSessions = sessionRegistry.getAllSessions(principal, /* includeExpiredSessions */ false); // Should not return null; if (!activeUserSessions.isEmpty()) { // Do something with user System.out.println(user); } } } } } 

J’espère que cela aide.

S’il vous plaît corrigez-moi si je me trompe aussi.

Je pense que la réponse de @Adam et @ elysch est incomplète. J’ai remarqué qu’il fallait append un auditeur:

  servletContext.addListener(HttpSessionEventPublisher.class); 

à

 public class AppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) { ... servletContext.addListener(HttpSessionEventPublisher.class); } 

avec sécurité conf:

 @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(final HttpSecurity http) throws Exception { // ... http.sessionManagement().maximumSessions(1).sessionRegistry(sessionRegistry()); } @Bean public SessionRegistry sessionRegistry() { return new SessionRegistryImpl(); } @Bean public HttpSessionEventPublisher httpSessionEventPublisher() { return new HttpSessionEventPublisher(); } } 

Et puis vous obtiendrez des utilisateurs en ligne actuels!