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
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
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
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!