Java Spring安全:如何实现暴力检测(BFD)?

Java Spring安全:如何实现暴力检测(BFD)?,java,security,spring,spring-security,brute-force,Java,Security,Spring,Spring Security,Brute Force,我的web应用程序安全由Spring security处理,但我找不到任何对暴力检测的现成支持 我想实现一些应用程序级BFD保护。例如,通过在数据库(JPA)中存储每个用户失败的登录尝试。然后,受攻击的用户帐户可以通过电子邮件获得锁定期或强制重新激活帐户 用Spring Security实现这一点的最佳方法是什么?是否有任何机构对此有示例代码或最佳实践?检测暴力攻击(密码猜测)的正常方法是让身份验证方案记录失败的登录尝试,并让单独的应用程序尝试检测日志文件中的可疑模式。我想有可能关闭循环,让检测

我的web应用程序安全由Spring security处理,但我找不到任何对暴力检测的现成支持

我想实现一些应用程序级BFD保护。例如,通过在数据库(JPA)中存储每个用户失败的登录尝试。然后,受攻击的用户帐户可以通过电子邮件获得锁定期或强制重新激活帐户


用Spring Security实现这一点的最佳方法是什么?是否有任何机构对此有示例代码或最佳实践?

检测暴力攻击(密码猜测)的正常方法是让身份验证方案记录失败的登录尝试,并让单独的应用程序尝试检测日志文件中的可疑模式。我想有可能关闭循环,让检测器采取行动锁定受到攻击的帐户,等等


有一个例子。

推出自己的BFD并不难。与SpringSecurity3.0一样,您可以简单地添加应用程序侦听器(感谢您为我指明了正确的方向)

当出现身份验证失败时,将调用此侦听器:

@Component
public class AuthenticationFailureListener
    implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> {

  @Autowired
  private UserDao userDao;

  public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent ev) {

    String username = ev.getAuthentication().getName();

    User user = userDao.find("name", username);
    if (user != null) { // only for existing users
            user.reportLoginFailure();
            userDao.commit();
    }
  }
}
@组件
公共类身份验证FailureListener
实现ApplicationListener{
@自动连线
私有UserDao UserDao;
Application Event上的公共无效(AuthenticationFailureBadCredentialsEvent ev){
字符串username=ev.getAuthentication().getName();
User=userDao.find(“名称”,用户名);
if(user!=null){//仅适用于现有用户
user.reportLoginFailure();
commit();
}
}
}
现在,每次身份验证失败都会通知用户。例如,用户增加身份验证失败计数器,并在达到某个阈值时自行停用该计数器

当用户正确验证后,以下侦听器将通知用户(例如,谁可以重置其验证失败计数器):

@组件
公共类身份验证SuccessEventListener
实现ApplicationListener{
@自动连线
私有UserDao UserDao;
ApplicationEvent上的公共无效(AuthenticationSuccessEvent事件){
字符串username=event.getAuthentication().getName();
User=userDao.find(“名称”,用户名);
user.reportLoginOK();
commit();
}
}
上述侦听器不需要额外的XML配置,由Spring自动拾取(如果它们在Spring组件扫描包中)

根据您的事务配置,此解决方案可能会错过一些失败的登录计数,如果它们几乎同时发生。如果使用单个更新查询更新计数器,而不是加载用户,然后保存更改,则可以防止这种情况


上述侦听器还可以扩展以检测其他BDF模式,例如,单个IP正在扫描大量(随机)用户名。

您还应该知道,锁定受攻击的帐户意味着使您的服务可供使用


众所周知的例子是:你提供拍卖服务,Bob想购买一些头寸并攻击Alice的账户,因此Alice不下注,而是在Bob获得头寸时尝试恢复她的账户。即使是临时(5秒)锁定也可能会阻止Alice根据需要使用该服务。

请注意,并非所有登录方法都使用AuthenticationSuccessEvent。您可能还需要查看InteractiveAuthenticationSuccessEvent。很好。谢谢如果可以,为什么不使用处理程序的机制,例如AuthenticationFailureHandler?我的意思是,为什么使用侦听器而不是处理程序?有什么优点/缺点吗?您还应该知道锁定受攻击的帐户意味着使您的服务可提交。众所周知的例子是:你提供拍卖服务,Bob想购买一些头寸并攻击Alice的账户,因此Alice不下注,而是在Bob获得头寸时尝试恢复她的账户。即使是临时的(5秒)锁也可能会阻止Alice使用她需要的服务。我相信一个每分钟最多登录次数的系统对用户更友好。如果用户尝试登录的速度过快,它将始终失败。这可能需要一个处理程序才能进行身份验证。有人知道该怎么做吗?@Kdeveloper,我尝试使用相同的代码,但没有调用失败事件的应用程序侦听器。我只是没有为成功的事件添加侦听器。你能帮我吗?嗨,斯蒂芬,不幸的是链接断了:(
@Component
public class AuthenticationSuccessEventListener
    implements ApplicationListener<AuthenticationSuccessEvent>{

  @Autowired
  private UserDao userDao;

  public void onApplicationEvent(AuthenticationSuccessEvent event) {

    String username = event.getAuthentication().getName();

    User user = userDao.find("name", username);
    user.reportLoginOK();
    userDao.commit();
  }
}