我是 Spring Security 的新手,我遇到过期用户 session 的问题。
在我的应用程序中,有 ROLE_ADMIN
的管理员,他们可以更改其他用户的角色。
我想终止其权限被管理员更改的用户的 session 。
我发现我可以通过使用 SessionRegistry 获取所有登录的用户 session 。
我检查了我是否可以使用 sessionRegistry.getAllSessions()
获取所有 SessionInformation,并尝试使用以下代码使 session 信息过期。
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));
我认为上面的代码足以使特定其他用户的 session 过期。
但是在 SecurityContextPersistenceFilter
中,身份验证从我认为已经过期的 session 中恢复。
我用 request.getSession()
检查过我可以获得我认为已经过期的有效 session 。甚至 information.getSessionId()
和 request.getSession()
中的 SessionID 是相同的。
我想知道为什么 session 没有过期。
我正在使用 Spring(不是 Spring-Boot)
最佳答案
如果您使用spring-session 和jdbc 或redis,您可以使用此代码清除任何用户的 session 。 Autowiring 此依赖项
@Autowired
private FindByIndexNameSessionRepository<? extends Session> sessionRepo;
传递您要清除 session 的用户的电子邮件/用户名。
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);
}
}
关于spring - 如何使 Spring Security 中的其他用户 session 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61693535/