使用Spring Security 3登录处理程序处理失败的登录通知

使用Spring Security 3登录处理程序处理失败的登录通知,spring,authentication,spring-security,Spring,Authentication,Spring Security,在我的应用程序中,我希望为我的用户增加一个失败登录尝试计数器,并在达到某个尝试计数时使用SpringSecurityVersion3.1.4.RELEASE锁定他们 我成功地实现了一个简单的登录成功通知处理程序,它将计数器重置为零,并将此状态保存在数据库中,如下所示 public class BitfoodLoginSuccessHandler extends BitfoodAuthHandler implements AuthenticationSuccessHandler { @Ove

在我的应用程序中,我希望为我的用户增加一个失败登录尝试计数器,并在达到某个尝试计数时使用SpringSecurityVersion3.1.4.RELEASE锁定他们

我成功地实现了一个简单的登录成功通知处理程序,它将计数器重置为零,并将此状态保存在数据库中,如下所示

public class BitfoodLoginSuccessHandler extends BitfoodAuthHandler implements AuthenticationSuccessHandler {

  @Override
  public void onAuthenticationSuccess(HttpServletRequest arg0,
      HttpServletResponse arg1, Authentication arg2) throws IOException,
      ServletException {

    String userName = arg2.getName();
    AppUser result = getBitfoodDao().getAuthDao().getUser(userName);

    if (result.getLoginStatus().getStatus() == UserLoginStatus.STATUS_ACTIVE) {
      result.getLoginStatus().setLoginFailCount(0);
      getBitfoodDao().getAuthDao().save(result);
    } // TODO redirect on success.
  }
}
然而,我试图找出如何在故障事件处理程序中实现相反的情况,具体来说,就是
org.springframework.security.web.authentication.AuthenticationFailureHandler
的实现

public class BitfoodLoginFailedHandler extends BitfoodAuthHandler implements
    AuthenticationFailureHandler {

  @Override
  public void onAuthenticationFailure(HttpServletRequest arg0,
      HttpServletResponse arg1, AuthenticationException arg2)
      throws IOException, ServletException {
    log.info("???????");
    /*if (ls.getLoginFailCount() >= 3) { // TODO parameterize this value
      ls.setStatus(UserLoginStatus.STATUS_LOCKED);
    }*/
  }
}
我知道,
org.springframework.security.core.AuthenticationException
提供了这两种方法,它们可能提供我需要的登录信息。具体地说,我正在尝试找出哪个用户名(如果有,以及它是否确实是我在DB上的用户)在当前登录尝试中失败

但是,在API的3.1.x版本中,这两种方法都被标记为不推荐使用。因此:

1) 是否有其他方法可以使用这些通知处理程序检索尝试失败的登录用户名

2)我应该考虑使用另一种机制来完成这个逻辑吗?如果是,SpringSecurity3提供了哪些替代方案

更新:哇,@axtavt的答案奏效了,结果比我想象的更干净,因为我再也不必乱弄我的安全管理器的过滤器配置了。很好

更新代码:

我更改了自定义类的接口:

public class BitfoodLoginFailedHandler extends BitfoodAuthHandler 
    implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> 

public class BitfoodLoginSuccessHandler extends BitfoodAuthHandler 
    implements ApplicationListener<AuthenticationSuccessEvent>
将其bean上下文定义保持原样:

<beans:bean id="successHandler" class="org.bitfood.admin.auth.BitfoodLoginSuccessHandler">
    <beans:property name="bitfoodDao" ref="daoService"/>
</beans:bean>

<beans:bean id="failureHandler" class="org.bitfood.admin.auth.BitfoodLoginFailedHandler">
    <beans:property name="bitfoodDao" ref="daoService"/>
</beans:bean>

瞧!在请求结束前收到适当的通知(包括用户名数据)


谢谢

接收认证事件通知的另一种方法是由Spring Security广播,即,
AuthenticationSuccessEvent
AbstractAuthenticationFailureEvent

public void onApplicationEvent(AuthenticationSuccessEvent event)
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event)
<beans:bean id="successHandler" class="org.bitfood.admin.auth.BitfoodLoginSuccessHandler">
    <beans:property name="bitfoodDao" ref="daoService"/>
</beans:bean>

<beans:bean id="failureHandler" class="org.bitfood.admin.auth.BitfoodLoginFailedHandler">
    <beans:property name="bitfoodDao" ref="daoService"/>
</beans:bean>