我想在用户登录系统后准备一些数据。在一些谷歌之后,我实现了一个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,它有效)。
我使用自己的身份验证管理器,对事件不做任何处理:
我是否需要自己播客?
谢谢。
答案 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是在成功验证的情况下发布事件的那个。
几个可能有帮助的问题:
理解发生的事情的最好方法是Ito调试Spring安全性(在ProviderManager中找到一个断点),我用它来做很多事情并发现它非常有用。
谢伊
答案 2 :(得分:0)
也许您想要侦听InteractiveAuthenticationSuccessEvent。例如,OpenID仅发出该事件。另请参阅SEC-1534。
答案 3 :(得分:0)
我有同样的问题,我发现了一些可能有用的东西。
我认为我们应该在web.xml中包含以下侦听器
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
如果您想知道您的问题是在听众检测中还是在公开场合,您可能会自己接受这些事件。
SecurityContextHolder.getContext()getAuthentication(); AuthenticationSuccessEvent event = new AuthenticationSuccessEvent( 。SecurityContextHolder.getContext()getAuthentication()); eventPublisher.publishEvent(事件);