我有多个AuthenticationProviders(MyOwn,Kerberos,Local)。我想在验证成功后用密码保存一些信息。但每个提供商之后的代码是不同的。所以我想在authenticationProvider成功之后立即运行此代码。我怎样才能做到这一点?
如果我使用AuthenticationSuccessHandler,它将在提供者取得任何成功后运行。如果我在CustomUserDetailsService中编写代码,我就无法在其中获取密码信息。
答案 0 :(得分:1)
您可以为AuthenticationSuccessEvent
注册听众。
ProviderManager
委托每个人注册AuthenticationProvider
。在AuthenticationProvider
之一成功进行身份验证后,ProviderManager
将通过AuthenticationSuccessEvent
发布AuthenticationEventPublisher
。
如果您希望收到此事件并获得对Authentication
的访问权限,则以下Java配置将在此事件的上下文中注册ApplicationListener
bean:
@Bean
public ApplicationListener<AuthenticationSuccessEvent> authenticationSuccessEventListener() {
return new ApplicationListener<AuthenticationSuccessEvent>() {
@Override
void onApplicationEvent(AuthenticationSuccessEvent event) {
Authentication authentication = event.getAuthentication();
// TODO
}
};
}
可以找到ApplicationListener
的进一步文档here: