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

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

Как я могу получить доступ к этому списку? Разве они уже не находятся где-то в весеннем контексте? Как 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(); } } 

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

  • JPA / JTA / @Transactional Spring аннотация
  • Interesting Posts

    Entity Framework: я устанавливаю внешний ключ, SaveChanges затем получает доступ к свойству навигации, но не загружает связанный объект. Почему нет?

    Rails: ссылки «Next post» и «Previous post» в моем представлении, как?

    Когда НЕ использовать статическое ключевое слово в Java?

    Идентификатор asp.net получает все роли зарегистрированных пользователей

    Изменение имен оптических дисков в Windows 7

    Копирование файла с индикатором выполнения

    PrimeFaces CSS look’n’feel отсутствует и JS «Ошибка ссылки на неволь: PrimeFaces не определен»

    Компиляция libjpeg

    Удаление узлов из XmlDocument

    Ошибка в клиенте WCF, использующем веб-службу Axis 2 с WS-Security. Имя пользователя: Token PasswordDigest.

    Кэш зависимостей Gradle может быть поврежден (это иногда происходит после таймаута сетевого соединения).

    Конструктор должен указать нулевую инициализацию всех встроенных элементов?

    Копирование файла в Windows 8 дает «недостаточно памяти» даже при большом объеме памяти и дискового пространства

    Элемент, который может иметь только одно из двух значений текста?

    Как решить уравнения с помощью java?

    Давайте будем гением компьютера.