Java 如何为特权用户提供无限制的会话,并将其他用户限制为仅并发一个会话,以及注销所有其他登录?
我有一个要求,某些特权用户应该被允许拥有无限数量的会话,而所有其他用户应该被限制为同时只有一个会话 在Spring Security中,我扩展了ConcurrentSessionControlAuthenticationStrategy类,并覆盖了该用户在每次登录Spring Security之前调用的方法Java 如何为特权用户提供无限制的会话,并将其他用户限制为仅并发一个会话,以及注销所有其他登录?,java,spring,session,spring-security,spring-session,Java,Spring,Session,Spring Security,Spring Session,我有一个要求,某些特权用户应该被允许拥有无限数量的会话,而所有其他用户应该被限制为同时只有一个会话 在Spring Security中,我扩展了ConcurrentSessionControlAuthenticationStrategy类,并覆盖了该用户在每次登录Spring Security之前调用的方法GetMaximumSessions,如下所示: @Override protected int getMaximumSessionsForThisUser(Authenticatio
GetMaximumSessions
,如下所示:
@Override
protected int getMaximumSessionsForThisUser(Authentication authentication) {
List<String> privilegedUsers = userRepo.findAllByIsPrivileged();
return privilegedUsers.contains(authentication.getName()) ? -1 : 1;
}
@Bean
public SessionRegistry getSessionRegistry() {
return new SessionRegistryImpl();
}
现在一切看起来都很好,工作也和预期的一样,除了我在这里想要的是,一旦检测到新的登录,所有以前的登录都应该注销,并且只应该维护一个并发会话/登录。
但实际上发生的是,对于所有新登录,上一个会话将过期,并创建和提供一个新会话用于登录,但当我返回到任何上一个登录屏幕时,它开始使用创建的新会话,并且应用程序工作正常,而不是注销。他们都共享相同的会话id,浏览器中的另一个观察结果是,它仍然在cookies中显示旧会话id,而在后端,旧会话id实际上已过期,每个操作的日志仅显示最新的会话id
因此,总而言之,我能够使用相同的会话Id登录到多个位置,我所期望的是,它应该注销所有以前的登录,而用户不应该对此采取任何操作
注意:对于特权用户,它仍然可以正常工作,每个新登录都有一个新的会话Id,并且所有用户都保留该Id,并且不共享会话Id
@Bean
public SessionRegistry getSessionRegistry() {
return new SessionRegistryImpl();
}