2012-05-02 90 views
3

只是一個關於春季安全和會議失效的問題。春季安全會議無效通過註銷

當ConcurrentSessionControlStrategy會話失效時,通過調用removeSessionInformation方法從SessionRegistry中刪除會話,但是當通過手動註銷使會話失效時,HttpSession失效,但沒有調用SessionRegistry將條目從那裏。

我已經添加了HttpSessionEventPublisher作爲捕獲HttpSessionDestroyedEvent事件,但再次沒有調用SessionRegistry的偵聽器。

我已經通過創建我自己的LogoutFilter實現並添加了一個處理程序來手動調用removeSessionInformation,但我希望能夠使用標準的Spring註釋(如果可能)。 (NB我不能使用標準註銷標籤的success-handler-ref字段,因爲會話已經失效,所以我不能訪問會話ID)

有沒有我在這裏丟失的東西或是這只是春天錯過的東西?

順便說一句,這是使用Spring Security 3.1.0。

+0

什麼是你想怎麼辦? – NimChimpsky

+0

我有一個應用程序只允許每個用戶一個會話。如果用戶已經有會話,則在登錄時提示用戶是否要終止觸發併發策略的活動會話並從會話註冊表中刪除會話。用戶也可以自己註銷,這將觸發註銷過濾器,使其HTTP會話無效,但不會從存儲庫中刪除會話。正如我所說我有一個解決方案,只是好奇如果有沒有自定義logoutFilter這樣做的方法。 – Rene

回答

2

我有同樣的問題。在我的情況下,解決方案是創建SessionRegistry作爲單獨的spring bean。 ConcurrentSessionControlStrategy擁有註冊表鏈接,因此它可以直接從它刪除無效會話。但SecurityContextLogoutHandler使用session.invalidate()所以sessionDestroyed servlet事件提供給HttpSessionEventPublisher通過servlet容器,但HttpSessionDestroyedEvent發佈到Spring上下文HttpSessionEventPublisher不來SessionRegistry時,它不是春豆。

此安全配置沒有工作:

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

這一個正常工作:

@Bean 
public SessionRegistry sessionRegistry() { 
    return new SessionRegistryImpl(); 
} 
... 
ConcurrentSessionControlStrategy concurrentSessionControlStrategy = new ConcurrentSessionControlStrategy(sessionRegistry()) 
... 
+0

我不能確認這個作品在我的案例中,因爲我已經進入另一個項目,但它似乎是一個不錯的簡單解決方案。 – Rene