2012-06-25 8 views
1

나는 스프링 3.1.1과 스프링 시큐리티 3.1.0을 사용하는 웹 애플리케이션을 가지고있다. SessionDestroyedEvent (s)를 검사하고 사용자 이름 및 기타 데이터를 기록해야하는 ApplicationListener를 구현했습니다. 그러나 getSecurityContexts()는 항상 빈 Collection을 리턴합니다. LDAP 서버에 대해 인증하고 있습니다. 나는 또한 getSource() 메소드를 검사하고 Principal 정보를 보유한 세션 데이터를 리턴한다. 그러나, 객체는 다르며 사용할 수있는 인터페이스/추상 클래스가없는 컨테이너 별 구현입니다. 내 질문은 이것이 SpringSecurity의 버그인지 또는 몇 가지 추가 구성을 할 수 있습니까?SessionDestroyedEvent getSecurityContexts() always empty

@Service 
public class ApplicationSecurityListener implements ApplicationListener<ApplicationEvent>{ 

@Override 
    public void onApplicationEvent(ApplicationEvent event) 
    { 
      else if (event instanceof SessionDestroyedEvent) 
    { 
     SessionDestroyedEvent sessinEvent = (SessionDestroyedEvent) event; 
     //System.out.println ("SessionDestroyedEvent:" + sessinEvent.getId()); 
     //load session if it is not empty 
     if(sessinEvent.getSecurityContexts() != null && !sessinEvent.getSecurityContexts().isEmpty()) 
     { 
      ... 
      }}}} 

답변

2

이 3.1.1 부 (SEC-1870 참조)로 릴리스한다 3.1.0에서 문제 : 여기

일부 중요한 코드이다. 3.1.1이 릴리스 될 때까지 onApplicationEvent에서 SecurityContext를 수동으로 가져 와서 문제를 해결할 수 있습니다. 앞서 언급 한 JIRA에서 changeset를 사용하면 가이드로이 같은 것을 가지고 올 것이다 :

public void onApplicationEvent(ApplicationEvent event) { 
    if(event instanceof SessionDestroyedEvent) { 
     SessionDestroyedEvent sdEvent = (SessionDestroyedEvent) event;  
     HttpSession session = sdEvent.getSession();  
     Enumeration<String> attributes = session.getAttributeNames();  
     ArrayList<SecurityContext> contexts = new ArrayList<SecurityContext>(); 

     while(attributes.hasMoreElements()) { 
      String attributeName = attributes.nextElement(); 
      Object attributeValue = session.getAttribute(attributeName); 
      if (attributeValue instanceof SecurityContext) { 
       contexts.add((SecurityContext) attributeValue); 
      } 
     } 
     /* ... do things with the contexts (may be empty) ...*/ 
    } 

    /* ... handle other conditions ... */ 

} 

당신이 단 하나의 SecurityContext이며 속성이 SecurityContext에이 저장된 이름을 변경하지 않은 알고있는 경우 (일반) 다음을 사용하여 얻을 수도 있습니다.

public void onApplicationEvent(ApplicationEvent event) { 
    if(event instanceof SessionDestroyedEvent) { 
     SessionDestroyedEvent sdEvent = (SessionDestroyedEvent) event;  
     HttpSession session = sdEvent.getSession(); 
     String attrName = HttpSessionSecurityContextRepository 
      .SPRING_SECURITY_CONTEXT_KEY; 
     SecurityContext context = session.getAttribute(attrName); 

     /* ... do things with the context (may be null) ...*/ 
    } 

    /* ... handle other conditions ... */ 

}