3

只是关于 Spring Security 和会话失效的问题。

当会话被 ConcurrentSessionControlStrategy 无效时,会话会通过调用 removeSessionInformation 方法从 SessionRegistry 中删除,但是当会话因手动注销而无效时,HttpSession 也会无效,但不会调用 SessionRegistry 从那里删除条目。

我已将 HttpSessionEventPublisher 添加为侦听器,该侦听器正在捕获 HttpSessionDestroyedEvent 事件,但再次没有调用 SessionRegistry。

我通过创建自己的 LogoutFilter 实现并添加一个处理程序来手动调用 removeSessionInformation 来解决这个问题,但如果可能的话,我希望能够使用标准的 spring 注释。(注意,我不能使用标准注销标签的 success-handler-ref 字段,因为会话已经失效,所以我无法访问会话 ID)

有什么我在这里遗漏的,还是这只是 Spring 遗漏的东西?

顺便说一下,这是使用 Spring Security 3.1.0。

4

1 回答 1

2

我有同样的问题。在我的情况下,解决方案是创建SessionRegistry一个单独的 spring bean。ConcurrentSessionControlStrategy保存指向注册表的链接,因此它可以直接从中删除无效会话。但是SecurityContextLogoutHandler使用session.invalidate()so sessionDestroyedservlet事件是HttpSessionEventPublisher由servlet容器提供的,但是当它不是spring bean时不会HttpSessionDestroyedEvent发布到Spring上下文。HttpSessionEventPublisherSessionRegistry

此安全配置不起作用:

...
SessionRegistry sessionRegistry = new SessionRegistryImpl();
ConcurrentSessionControlStrategy concurrentSessionControlStrategy = new ConcurrentSessionControlStrategy(sessionRegistry);
...

这个工作正常:

@Bean
public SessionRegistry sessionRegistry() {
    return new SessionRegistryImpl();
}
...
ConcurrentSessionControlStrategy concurrentSessionControlStrategy = new ConcurrentSessionControlStrategy(sessionRegistry())
...
于 2012-10-23T20:33:09.827 回答