Caffeine Cache всегда возвращает null с помощью метода getIfPresent - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь внедрить кэш кофеина, чтобы избежать попыток входа в систему методом грубой силы.Так что у меня есть кеш с ключом = 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 к кофеину, он работает довольно хорошо.Но я понятия не имею, почему это не работает.

...