在春季安全中注销特定会话ID

Posted

技术标签:

【中文标题】在春季安全中注销特定会话ID【英文标题】:logout specific session Id in spring security 【发布时间】:2016-11-06 22:42:07 【问题描述】:

在春季安全: 我认为使用两种方式注销:发生会话超时或用户注销本身时... 无论如何,以这些方式,在HttpSessionEventPublisherSessionRegistry 中调用destroySession,从sessionIds 列表中删除SessionInformation... 当我使用以下方法强制注销特定用户时,此方法只是在 SessionRegistry 中“过期”SessionInformation。现在,当我从SessionRegistry 获取所有在线用户“getAllPrincipals()”时,会话过期的用户在列表中!

@Override
public  boolean forceLogOut(int userId)
    for (Object username: sessionRegistry.getAllPrincipals()) 
        User temp = (User) username;
        if(temp.getId().equals(userId))
            for (SessionInformation session : sessionRegistry.getAllSessions(username, false)) 
                session.expireNow();
            
        
    
    return true;

如何从“Web 服务器”和“会话注册表”中注销会话对象的“特定用户”或“会话 ID”? 我在谷歌上搜索并在 Servlet API 中找到了HttpSessionContext,它可以从特定的 sessionId 获取 HttpSession。然后使会话无效。但我认为这种方法并不完全有用! (注意。这个类已被弃用!) 什么是最好的方法?是不是我错了?

【问题讨论】:

sessionRegistry.getSessionInformation(sessionId).expireNow(); Spring 会将这个会话标记为过期。此会话的任何进一步请求都将调用注销。 这是真的,但是如果用户不发送任何请求并且会话超时最大超过 1 小时(超时不触发),那么,当使用 getAllPrincipals() 时,此方法返回所有原则包括在线会话和过期会话...这是我的问题...! 【参考方案1】:

试试这样:

@RequestMapping(value="/logout", method = RequestMethod.GET)
    public String logoutPage (HttpServletRequest request, HttpServletResponse response)
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null)    
            //new SecurityContextLogoutHandler().logout(request, response, auth);
            persistentTokenBasedRememberMeServices.logout(request, response, auth);
            SecurityContextHolder.getContext().setAuthentication(null);
        
        return "redirect:/login?logout";
    

要注销特定会话 ID,请检查该链接: how to log a user out programmatically using spring security

【讨论】:

感谢您的响应...我想强制注销一个用户和另一个用户,然后立即从SessionRegistry 和我的 Web 服务器中删除用户的会话对象..我认为这种方法会自行注销用户。 ! 您知道我该怎么做吗?我想管理在线用户,强制注销后一个用户看到在线用户。当我使用 getAllPrincipals() 时,过期会话在列表中......! 我看到link.. 感谢您的尝试...我必须同时使用session.expireNow();sessionRegistry.removeSessionInformation(info.getSessionId());.. 但是在客户端发送请求或触发超时之前会话不会从Web 服务器中删除。 ..! 欢迎 :p .. 如果您的问题得到解决,您可以接受它作为有效答案 如果我忽略 Web 服务器问题,这个答案是有效的:D...无论如何感谢您的帮助...也许我无法从 Web 服务器中删除会话...我不知道..!

以上是关于在春季安全中注销特定会话ID的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Laravel 的特定会话中注销用户?

春季/安全中的自定义会话超时

从春季安全会话序列化中排除属性?

春季安全会话超时

春季安全会话标识符未更新

春季安全并发会话不起作用