2012-05-02 3 views
3

스프링 보안 및 세션 무효화에 관한 질문.로그 아웃을 통한 스프링 보안 세션 무효화

ConcurrentSessionControlStrategy에 의해 세션이 무효화되면 removeSessionInformation 메소드를 호출하여 SessionRegistry에서 세션이 제거되지만 수동 로그 아웃으로 세션이 무효화 될 때 HttpSession은 무효화되지만 SessionRegistry를 호출하여 항목을 제거 할 필요가 없습니다. 그곳에.

HttpSessionDestroyedEvent 이벤트를 캡처하는 수신기로 HttpSessionEventPublisher를 추가했지만 SessionRegistry를 다시 호출하지 않았습니다.

나는 LogoutFilter의 자체 구현을 만들고 removeSessionInformation을 수동으로 호출하는 처리기를 추가하여이 문제를 해결했지만 가능한 경우 표준 스프링 주석을 사용할 수 있어야합니다. (NB 세션이 이미 무효화되어 세션 ID에 액세스 할 수 없으므로 표준 로그 아웃 태그의 success-handler-ref 필드를 사용할 수 없습니다.)

여기에 누락되었거나 누락 된 것이 있습니까? 이것은 봄이 놓친 것입니다.

이것은 Spring Security 3.1.0을 사용하고 있습니다.

+0

당신이 뭘 하려는지? – NimChimpsky

+0

사용자 당 세션을 하나만 허용하는 앱이 있습니다. 사용자에게 이미 세션이있는 경우 동시 전략을 트리거하는 활성 세션을 종료할지 여부를 묻는 메시지가 나타나고 세션 레지스트리에서 세션이 제거됩니다. 사용자는 자신을 로그 아웃하여 로그 아웃 필터를 트리거하고 HTTP 세션을 무효화하지만 저장소에서 세션을 제거하지 않을 수 있습니다. 내가 말했듯이 logoutFilter를 커스터마이징하지 않고 이것을 할 수있는 방법이 있는지 궁금해한다. – Rene

답변

2

나는 동일한 문제가있었습니다. 필자의 경우 솔루션은 별도의 스프링 빈으로 SessionRegistry을 생성하는 것이었다. ConcurrentSessionControlStrategy에는 레지스트리 링크가있어 유효하지 않은 세션을 직접 제거 할 수 있습니다. 그러나 SecurityContextLogoutHandlersession.invalidate() 그래서 sessionDestroyed 서블릿 이벤트가 서블릿 컨테이너에 의해 HttpSessionEventPublisher에 제공되는 사용하지만 HttpSessionDestroyedEvent는 스프링 빈되지 때 SessionRegistry에 오지 않는 HttpSessionEventPublisher에 의해 문맥을 봄에 발표했다.

이 보안 설정이 작동하지 않았다

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

이 하나가 잘 작동 :

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

다른 프로젝트로 옮겨 갔기 때문에 제 경우에는 이것이 작동하는지 확인할 수는 없지만 멋진 간단한 솔루션처럼 보입니다. – Rene

관련 문제