如何在Spring Security中终止其他用户会话

fd3cxomn  于 2022-11-24  发布在  Spring
关注(0)|答案(1)|浏览(232)

我是Spring Security的新手,我遇到了过期用户会话的问题。
在我的应用程序中,有ROLE_ADMIN的管理员,他们可以更改其他用户的角色。
我想使权限被管理员更改的用户的会话过期。
我发现我可以通过使用SessionRegistry获得所有登录用户的会话。
我检查了可以使用sessionRegistry.getAllSessions()获取所有会话信息,并尝试使用以下代码使会话信息过期。

List<SessionInformation> sessionInformations = sessionRegistry.getAllSessions(allPrincipals.get(i), false);

for (SessionInformation information : sessionInformations) {
    information.expireNow();
    sessionRegistry.removeSessionInformation(information.getSessionId());
}

allPrincipals.set(i, new AccountUserAdaptor(requestedAccount));

我认为以上代码足以使特定其他用户的会话过期。
但是在SecurityContextPersistenceFilter中,身份验证是从我认为已经过期的会话中恢复的。
我检查了request.getSession(),我可以得到有效的会话,我认为已经过期。甚至在information.getSessionId()request.getSession()的SessionID是相同的。
我想知道为什么会话未过期。

我使用的是Spring(不是Spring-Boot)

0s7z1bwu

0s7z1bwu1#

如果您正在使用spring-sessionjdbc或redis,您可以使用此代码清除任何用户的会话。

@Autowired
private FindByIndexNameSessionRepository<? extends Session> sessionRepo;

传递要清除会话的用户的电子邮件/用户名。

Set<String> sessionIds = sessionRepo
                .findByIndexNameAndIndexValue(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, userEmail)
                .keySet();

if (sessionIds.size() > 0) {
    log.debug("existing sessions: {}", sessionIds.size());
    for (String sessionId : sessionIds) {
        sessionRepo.deleteById(sessionId);
    }
}

相关问题