我怎样才能有所有用户login(通过弹簧安全)我的Web应用程序的列表
我在我的web应用程序中使用spring安全,现在我想要列出所有在我的程序中login的用户。
我怎样才能访问该列表? 他们不是已经在spring的框架内保存了吗? 像SecurityContextHolder或SecurityContextRepository ?
为了访问所有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(); } }
然后你会得到当前在线用户!
- 用Hibernate + Spring进行caching – 一些问题!
- 在Hibernate中重新挂接分离对象的正确方法是什么?
- 如何触发基于服务器响应的jquery.ajax()错误callback,而不是HTTP 500?
- Spring Security在成功login后redirect到上一页
- JPA @OneToMany – >父 – 子参考(外键)
- 获取错误org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“springSecurityFilterChain”的bean
- 使用YAML的Spring @PropertySource
- 在Spring中将bean引用注入Quartz作业?
- Spring Boot – 处理Hibernate SessionFactory