Как я могу получить список всех зарегистрированных пользователей (через весеннюю безопасность), мое веб-приложение

Я использую весеннюю безопасность в своем веб-приложении, и теперь я хочу иметь список всех пользователей, которые вошли в мою программу.

Как я могу получить доступ к этому списку? Разве они уже не находятся где-то в весеннем контексте? Как SecurityContextHolder или SecurityContextRepository ?

Для доступа к списку всех зарегистрированных пользователей вам нужно ввести экземпляр SessionRegistry в свой компонент.

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

И затем, используя проверенный SessionRegistry, вы можете получить доступ к списку всех участников:

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

Но перед тем, как вводить сеансовый реестр, вам нужно определить часть управления сеансом в файле spring-security.xml (см. Раздел «Управление сеансом » в справочной документации Spring Security ), а в разделе «Управление параллелизмом» вы должны установить псевдоним для объекта реестра сеанса ( session-registry- псевдоним ), посредством которого вы будете вводить его.

      ...  

В JavaConfig это будет выглядеть так:

 @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()); } } 

С вызывающим кодом, выглядящим следующим образом:

 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); } } } } 

Обратите внимание, что SecurityUser – это мой собственный class, который реализует UserDetails .

Пожалуйста, поправьте меня, если я ошибаюсь.

Я думаю, что ответ Адама является неполным. Я заметил, что сеансы, которые уже истекли в списке, появлялись снова.

 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); } } } } } 

Надеюсь, поможет.

Пожалуйста, поправьте меня, если я ошибаюсь.

Я думаю, что ответ Адама и @ elysch является неполным. Я заметил, что необходимо добавить слушателя:

  servletContext.addListener(HttpSessionEventPublisher.class); 

в

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

с безопасностью 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(); } } 

И тогда вы получите онлайн-пользователей!

  • Фильтровать определенные пакеты в @ComponentScan
  • Давайте будем гением компьютера.