我们正在使用" ConcurrentSessionControlAuthenticationStrategy",具有以下配置:
<bean
class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy">
<constructor-arg ref="clusteredSessionRegistryImpl" />
<property name="maximumSessions" value="1" />
<property name="exceptionIfMaximumExceeded" value="false" />
</bean>
当用户登录,然后从其他浏览器第二次登录时 - 我们可以看到调用以下代码(按预期方式):
protected void allowableSessionsExceeded(List<SessionInformation> sessions, int allowableSessions,
SessionRegistry registry) throws SessionAuthenticationException {
...
leastRecentlyUsed.expireNow();
}
&#34; leastRecentlyUsed&#34;是实际的旧会话(如预期的那样)。 现在,一切都很好,但事实上这个到期并不会最终杀死旧会话,另一个应该过期的浏览器会话仍然可以使用该应用程序与其他浏览器中的较新会话并发使用。似乎没有发生会议实际销毁的过程。
1)谁\谁有责任摧毁会话?
2)我们如何解决这个问题?
答案 0 :(得分:1)
我遇到了类似的问题,结果证明是浏览器缓存。 请参阅此问题here
在我的情况下,我清除了缓存,并注意到应该注销的浏览器最终无法访问我的网络应用程序的内容。
<强>更新强>
最终发现我们在后端使用两种配置来保护安全上下文。
我必须使会话注册表保持静态,并在两种配置中调用相同的实例。
private static final SessionRegistry SESSION_REGISTRY = new SessionRegistryImpl();
然后设置一个bean:
@Bean
public static SessionRegistry sessionRegistry() {
return SESSION_REGISTRY;
}
最后在两种配置中使用相同的实例:
httpSecurity
... // you configuration
.sessionManagement()
.maximumSessions(5)
.maxSessionsPreventsLogin(true)
.sessionRegistry(sessionRegistry()).and()
希望这有助于其他人:)