Я пытаюсь внедрить кэш кофеина, чтобы избежать попыток входа в систему методом грубой силы.Так что у меня есть кеш с ключом = IP-адресом и значением = количество попыток входа в систему.
У меня есть служба, которая создает кэш Caffeine и некоторые методы для обработки неудачных попыток входа в систему и событий успеха.Если пользователь вводит неверные учетные данные, то вызывается метод loginFailed(String key)
.Тем не менее, getIfPresent(key)
всегда возвращает ноль, даже после того, как метод put работает.
Кстати, IP-адрес исходит от AuthenticationFailureListener компонента.
Я пытался использовать Google GuavaКэш, однако он устарел и заменен на Кофеин.
LoginAttemptService
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class LoginAttemptService {
@Value("${captcha.maxAttempt}")
private int MAX_ATTEMPT;
@Value("${captcha.attemptExpirationHour}")
private int ATTEMPT_EXPIRE_DURATION;
private Cache<String, Integer> attemptsCache;
public LoginAttemptService() {
super();
attemptsCache = Caffeine.newBuilder().
expireAfterWrite(ATTEMPT_EXPIRE_DURATION, TimeUnit.HOURS).build();
}
public void loginSucceeded(String key) {
attemptsCache.invalidate(key);
}
public void loginFailed(String key) {
Integer attempts = attemptsCache.getIfPresent(key);
if (attempts != null) {
attempts++;
attemptsCache.put(key, attempts);
} else {
attemptsCache.put(key, 1);
}
}
public boolean isBlocked(String key) {
Integer numberOfAttemps = attemptsCache.getIfPresent(key);
if (numberOfAttemps != null) {
return numberOfAttemps >= MAX_ATTEMPT;
} else {
return false;
}
}
}
Выше кода, я ожидал, что когда вызывается метод isBlocked(String key)
, он долженвернуть число попыток данного ключа, который является IP-адресом.
Редактировать: Я обнаружил проблему на самом деле.Если я не добавлю expireAfterWrite
к кофеину, он работает довольно хорошо.Но я понятия не имею, почему это не работает.