Không khó để cuộn BFD của riêng bạn. Như trong Spring Security 3.0, bạn có thể thêm ứng dụng nghe đơn giản (nhờ Stephen C để chỉ cho tôi đúng hướng).
nghe này sẽ được gọi khi thất bại xác thực xuất hiện:
@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();
}
}
}
Mỗi thất bại xác thực bây giờ sẽ thông báo cho người sử dụng. Ví dụ, người dùng tăng một bộ đếm lỗi xác thực và tự tắt nó khi đạt đến một ngưỡng nhất định.
Khi một người dùng được xác thực đúng người nghe dưới đây sẽ thông báo cho người sử dụng (người ví dụ có thể đặt lại là quầy thất bại xác thực):
@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();
}
}
Các thính giả trên sẽ không cần thêm cấu hình XML và được đón tự động bởi Spring (nếu chúng nằm trong gói Spring-scan).
Tùy thuộc vào cấu hình giao dịch của bạn, giải pháp này có thể bỏ lỡ một số lần đăng nhập không thành công nếu chúng xảy ra gần như đồng thời. Điều này có thể được ngăn chặn nếu bạn cập nhật bộ đếm với một truy vấn UPDATE duy nhất thay vì tải người dùng và sau đó lưu các thay đổi.
Người nghe trên cũng có thể được mở rộng để phát hiện các mẫu BDF khác, ví dụ: một IP duy nhất đang thực hiện quét trên tên người dùng (ngẫu nhiên) của lô.
Xin lưu ý rằng không phải tất cả các phương pháp đăng nhập đều sử dụng AuthenticationSuccessEvent. Bạn cũng có thể xem InteractiveAuthenticationSuccessEvent. – Florian
. Nếu tôi có thể, tại sao bạn không sử dụng máy móc của các trình xử lý, chẳng hạn như AuthenticationFailureHandler? Tôi có nghĩa là, tại sao sử dụng người nghe thay vì xử lý? bất kỳ ưu/khuyết điểm nào? – OhadR
Bạn cũng nên biết rằng khóa tài khoản bị tấn công có nghĩa là làm cho dịch vụ của bạn có thể chạy được. Ví dụ nổi tiếng là: bạn cung cấp dịch vụ đấu giá, Bob muốn mua một số vị trí và tấn công tài khoản của Alice, vì vậy thay vì đặt cược Alice cố gắng khôi phục tài khoản của cô trong khi Bob nhận vị trí. Ngay cả các khóa tạm thời (5 giây) có thể ngăn Alice sử dụng dịch vụ khi cần. – otonglet