无法检测到SpringSecurity3.0 AuthenticationSuccessEvent

时间:2009-12-22 03:02:19

标签: spring-security

我想在用户登录系统后准备一些数据。在一些谷歌之后,我实现了一个ApplicationListener来监听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());

        }

    }

我更新到Spring 3.0 RELEASE和Spring Security 3.0.0.RC2。但我永远无法调用AuthenticationSuccessEvent:((我尝试过其他事件,例如AuthenticationFailureBadCredentialsEvent,它有效)。

我使用自己的身份验证管理器,对事件不做任何处理:              

我是否需要自己播客?

谢谢。

4 个答案:

答案 0 :(得分:3)

您没有指定配置的详细信息。您声明您使用自己的身份验证管理器 - 这是否意味着您使用Spring Bean配置显式配置ProviderManager

如果是这样,您需要在AuthenticationEventPublisher上配置ProviderManager,因为默认实现是null实现,不会发布事件。

默认实现的bean声明如下:

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

然后,您需要将此bean映射到ProviderManager上的相应属性:

     

如果您没有声明自己的ProviderManager,遗憾的是无法使用安全命名空间配置样式启用此功能。希望能回答你的问题!

答案 1 :(得分:2)

我正在使用Spring-Security 2.0.4,但我认为它非常相似。 从我看到的是,ProviderManager是在成功验证的情况下发布事件的那个。

几个可能有帮助的问题:

  1. 您是使用标准的ProviderManager(org.springframework.security.providers.ProviderManager)还是提供自己的一个?
  2. 也许@Component不起作用?,也许(仅用于测试)你可以尝试常规的addListener()函数。
  3. 理解发生的事情的最好方法是Ito调试Spring安全性(在ProviderManager中找到一个断点),我用它来做很多事情并发现它非常有用。

    谢伊

答案 2 :(得分:0)

也许您想要侦听InteractiveAuthenticationSuccessEvent。例如,OpenID仅发出该事件。另请参阅SEC-1534

答案 3 :(得分:0)

我有同样的问题,我发现了一些可能有用的东西。

  1. 我认为我们应该在web.xml中包含以下侦听器

    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
    
  2. 如果您想知道您的问题是在听众检测中还是在公开场合,您可能会自己接受这些事件。

    SecurityContextHolder.getContext()getAuthentication(); AuthenticationSuccessEvent event = new AuthenticationSuccessEvent( 。SecurityContextHolder.getContext()getAuthentication()); eventPublisher.publishEvent(事件);