如何按特定主体名称删除现有会话

Posted

技术标签:

【中文标题】如何按特定主体名称删除现有会话【英文标题】:How to remove existing sessions by specific principal name 【发布时间】:2017-06-24 07:45:55 【问题描述】:

我在我的项目中使用带有 Redis 后端的 Spring Session 1.3.0。

我有一个用例,超级管理员可能会更新可能已经登录的现有用户的角色。我想在更改角色后删除这些用户的现有会话记录。

有Spring Session的API来存档吗?

【问题讨论】:

【参考方案1】:
    @Autowired
    private SessionRegistry sessionRegistry;

    public void expireUserSessions(String username) 
        for (Object principal : sessionRegistry.getAllPrincipals()) 
            if (principal instanceof User) 
                UserDetails userDetails = (UserDetails) principal;
                if (userDetails.getUsername().equals(username)) 
                    for (SessionInformation information : sessionRegistry.getAllSessions(userDetails, true)) 
                        information.expireNow();
                    
                
            
        
    

【讨论】:

【参考方案2】:

还想出另一种方法来清理特定用户的会话,

@Autowired
FindByIndexNameSessionRepository sessionRepository;

sessionRepository.findByIndexNameAndIndexValue(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME,
                username).keySet().forEach(session -> sessionRepository.delete((String) session));

【讨论】:

如果您允许单个用户的多个会话,则过早删除会话会产生一些副作用。看看这个问题。 ***.com/questions/22370819/… @mirmdasif 这是一个有趣的发现。我想知道为什么 spring/spring security 仍然允许使用无效会话 id(过期或删除)的请求。

以上是关于如何按特定主体名称删除现有会话的主要内容,如果未能解决你的问题,请参考以下文章

phpmyadmin sso 不会在注销时删除现有会话

如何在注销时取消设置特定的 php 会话

如何查询现有 postgres 会话的事务隔离级别?

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

如何将数组推送到 laravel 中的现有会话

是否可以仅从特定路径验证会话?