Ответ 1
Не так сложно катить собственный BFD. Как и в Spring Security 3.0, вы можете просто добавить слушателей приложений (спасибо Stephen C для указания меня в правильном направлении).
Этот прослушиватель вызывается при появлении сбоев проверки подлинности:
@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();
}
}
}
Каждая ошибка аутентификации будет теперь информировать пользователя. Пользователь, например, увеличивает счетчик сбоев проверки подлинности и дезактивирует его сам при достижении определенного порога.
Когда пользователь правильно аутентифицирован, нижеприведённый слушатель информирует пользователя (который, например, может reset его счетчики проверки подлинности):
@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();
}
}
Вышеуказанные слушатели не нуждаются в дополнительной конфигурации XML и автоматически выбираются Spring (если они находятся в пакете компонент-сканирования Spring).
В зависимости от конфигурации транзакции это решение может пропустить некоторые неудачные подсчеты входа в систему, если они происходят одновременно. Это можно предотвратить, если вы обновите счетчик с помощью одного запроса UPDATE вместо загрузки пользователя, а затем сохраните изменения.
Выше прослушиватели также могут быть расширены для обнаружения других BDF-паттернов, например, одного IP-адреса, который выполняет сканирование множества (случайных) имен пользователей.