2009-12-22 2 views
1

사용자 로그인 시스템 후에 일부 데이터를 준비하고 싶습니다. 나는 3.0 RELEASE 봄 업데이트SpringSecurity3.0 AuthenticationSuccessEvent를 감지 할 수 없습니다.

import org.springframework.context.ApplicationListener; 
import org.springframework.security.authentication.event.AuthenticationSuccessEvent; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.stereotype.Component; 

    @Component 
    public class MyApplicationListener implements 
      ApplicationListener<AuthenticationSuccessEvent> { 

     @Override 
     public void onApplicationEvent(AuthenticationSuccessEvent event) { 
      UserDetails userDetails = (UserDetails) event.getAuthentication() 
        .getPrincipal(); 
      System.out.println("Successed login:" + userDetails.getUsername()); 

     } 

    } 

, 그리고 봄 보안 3.0.0.RC2 : 일부 구글 후, 나는 AuthenticationSuccessEvent을 듣고 만약 ApplicationListener를 구현했습니다. 그러나 나는 (내가이 일을, 같은 AuthenticationFailureBadCredentialsEvent 같은 다른 이벤트를 시도) :(AuthenticationSuccessEvent 요구 만나지 수

내가 내 자신의 인증 관리자를 사용하여 이벤트에 대한 아무것도하지 :.

마 나는 봄 - 보안 2.0.4을 사용하고

답변

3

구성 세부 정보를 지정하지 않았습니다. 자신의 인증 관리자를 사용한다고 명시하고 있습니다. 즉, 명시 적으로 Spring Bean 구성을 사용하여 ProviderManager을 구성한다는 의미입니까?

기본 구현이 이벤트를 게시하지 않는 null 구현이므로 AuthenticationEventPublisherProviderManager에 구성해야합니다.

기본 구현을위한 빈 선언은 다음과 같다 :

경우 :

<bean id="defaultAuthEventPublisher" class="org.springframework.security.authentication.DefaultAuthenticationEventPublisher"/> 

당신은 다음 ProviderManager에 해당하는 속성이 빈을 매핑해야합니다 당신은 자신의 ProviderManager을 선언하지 않았지만 안타깝게도 보안 네임 스페이스 스타일의 구성을 사용하여이 기능을 사용할 수있는 방법이 없습니다. 희망은 당신의 질문에 답합니다!

2

.

감사합니다? 자신에 의해 이벤트를 팟 캐스트 필요하지만, 나는 꽤 같은 생각합니다. 나는의 ProviderManager를 보았다는 것과 하나입니다 일 성공적인 인증의 경우 이벤트를 게시하십시오. 도움이 될

몇 가지 질문 :

  1. 당신이 표준의 ProviderManager (org.springframework.security.providers.ProviderManager) 또는 자신 중 하나를 제공를 사용하십니까?
  2. 어쩌면 @Component가 작동하지 않습니까? (아마도 테스트 용) 일반 addListener() 함수를 사용해 볼 수 있습니다.

무슨 일이 벌어지는 지 이해하는 가장 좋은 방법은 Spring Security (ProviderManager에서 중단 점 찾기)를 디버그하는 것입니다. 저는 이것을 많이 사용하여 매우 유용하다고 생각합니다.

셰이

0

아마도 InteractiveAuthenticationSuccessEvent를 수신하고 싶을 것입니다. 예를 들어 OpenID는 해당 이벤트 만 방출합니다. SEC-1534도 참조하십시오.

0

나는 동일한 문제가 있으며 도움이 될만한 몇 가지 점을 발견했습니다.

  1. 나는 당신의 문제는 청취자 탐지에 있거나 당신이 이벤트를 직접 미사일을 트레이 수 publising 경우에 당신이 궁금해하는 경우 우리는 web.xml에

    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
    
  2. 에 다음 수신기를 포함해야한다고 생각합니다.

    SecurityContextHolder.getContext(). getAuthentication(); AuthenticationSuccessEvent 이벤트 = new AuthenticationSuccessEvent ( SecurityContextHolder.getContext(). getAuthentication()); eventPublisher.publishEvent (event);

관련 문제