我希望您能帮助我了解如何实现此功能: admin使用sessionRegistry.getAllPrincipals()获取所有登录用户,然后可以注销某人。 我知道如何注销当前用户(session.invalidate()),但不知道如何强制注销其他用户。
此代码让我全部登录用户
public List<User> getAllLoggedInUsers() {
List<Object> principals = sessionRegistry.getAllPrincipals();
List<User> usersNamesList = new ArrayList<>();
for (Object principal : principals) {
if (principal instanceof org.springframework.security.core.userdetails.User) {
usersNamesList.add(dao.findByLogin(((org.springframework.security.core.userdetails.User) principal).getUsername()));
}
}
return usersNamesList;
}
非常感谢。
编辑1:我想要下一个:管理员选择一个用户,禁止它(在数据库中更改信息)然后如果该用户处于活动状态 - 请将其注销。
答案 0 :(得分:1)
首先,您需要一个sessionRegistry
,这可以获得所有会话并注册新会话:
@Bean
SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
其次,您需要启用sessionRegistry
并使用ConcurrentSessionFilter
来控制无效会话。
http
.sessionManagement()
.maximumSessions(-1)
.sessionRegistry(sessionRegistry());
-1
表示无限制,但这会自动注册ConcurrentSessionFilter
和RegisterSessionAuthenticationStrategy
。基于上一个春季安全配置,如果您使用xml或旧版本的spring安全性,请查找this page以获取帮助。
ConcurrentSessionFilter
将从sessionRegistry
获取会话,并在会话过期时注销。
当尝试按用户进行会话并使用户的会话到期时,最后一件事就是向应用程序注入相同的sessionRegistry
bean。
您可以通过调用getAllSessions(Object principal,boolean includeExpiredSessions)方法列出用户的会话,该方法返回SessionInformation对象的列表。您还可以通过在SessionInformation实例上调用expireNow()来使用户的会话到期。当用户返回应用程序时,将阻止他们继续进行。
答案 1 :(得分:-2)
假设您尝试这样做。
public void logoutUser(HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
Authentication auth = getAuthentication();
for (int i = 0; i < logoutHandler.length; i++) {
logoutHandler[i].logout(httpRequest, httpResponse, auth);
}
AnonymousAuthenticationToken aat = new AnonymousAuthenticationToken("your key you use",
"anonymousUser", new GrantedAuthority[]{
new GrantedAuthorityImpl("ROLE_ANONYMOUS")});
((SecurityContext)SecurityContextHolder.getContext()).setAuthentication(aat);
}
您还可以获取当前登录的用户并设置SecurityContextHolder.getContext().setAuthentication(null)