由管理员Spring Security注销用户

时间:2017-06-04 23:26:14

标签: spring spring-mvc spring-security

我希望您能帮助我了解如何实现此功能: 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:我想要下一个:管理员选择一个用户,禁止它(在数据库中更改信息)然后如果该用户处于活动状态 - 请将其注销。

2 个答案:

答案 0 :(得分:1)

首先,您需要一个sessionRegistry,这可以获得所有会话并注册新会话:

@Bean
SessionRegistry sessionRegistry() {
    return new SessionRegistryImpl();
}

其次,您需要启用sessionRegistry并使用ConcurrentSessionFilter来控制无效会话。

http
 .sessionManagement() 
    .maximumSessions(-1)
    .sessionRegistry(sessionRegistry());

-1表示无限制,但这会自动注册ConcurrentSessionFilterRegisterSessionAuthenticationStrategy。基于上一个春季安全配置,如果您使用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);
    }

您还可以在post1post2中找到更多方法。

您还可以获取当前登录的用户并设置SecurityContextHolder.getContext().setAuthentication(null)