我怎样才能有所有用户login(通过弹簧安全)我的Web应用程序的列表

我在我的web应用程序中使用spring安全,现在我想要列出所有在我的程序中login的用户。
我怎样才能访问该列表? 他们不是已经在spring的框架内保存了吗? 像SecurityContextHolderSecurityContextRepository

为了访问所有login用户的列表,你需要注入SessionRegistry实例到你的bean。

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

然后使用受到伤害的SessionRegistry可以访问所有主体的列表:

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

但在注入会话registry之前,您需要在spring-security.xml中定义会话pipe理部分(请参阅Spring Security参考文档中的会话pipe理部分 ),在并发控制部分中,您应该为会话registry对象( session-registry-别名 ),你将注入它。

  <security:http access-denied-page="/error403.jsp" use-expressions="true" auto-config="false"> <security:session-management session-fixation-protection="migrateSession" session-authentication-error-url="/login.jsp?authFailed=true"> <security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" expired-url="/login.html" session-registry-alias="sessionRegistry"/> </security:session-management> ... </security:http> 

在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> httpSessionEventPublisher() { return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher()); } } 

调用代码如下所示:

 public class UserController { @Autowired private SessionRegistry sessionRegistry; public void listLoggedInUsers() { final List<Object> 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是我自己的类实现UserDetails

如果我错了,请纠正我。

我认为@亚当的答案是不完整的。 我注意到那里出现的会话已经在列表中过期。

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

希望能帮助到你。

如果我错了,请纠正我。

我认为@ Adam和@ 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(); } } 

然后你会得到当前在线用户!