package fr.mcc.ginco.security; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; @Service("lockoutService") public class LockoutService { private Map<String, LockoutData> lockMap = new HashMap<String, LockoutData>(); private static class LockoutData { private int attempts; private long lastMillis; } @Value("${login.max.attempts}") private int defaultMaxAttemps; public int getMaxAttemps() { return defaultMaxAttemps; } @Value("${login.lockout.seconds}") private long defaultLockoutSeconds; public boolean isLockedOut(String username) { LockoutData data = getData(username); if (data.attempts >= defaultMaxAttemps) { long last = System.currentTimeMillis() - data.lastMillis; if (last < 1000 * defaultLockoutSeconds) { return true; } } return false; } public void notifyLoginFailure(String username, long timestamp) { LockoutData data = getData(username); data.attempts++; data.lastMillis = timestamp; } public void notifyLoginSuccess(String username) { LockoutData data = getData(username); data.attempts = 0; } private LockoutData getData(String username) { LockoutData data = lockMap.get(username); if (data == null) { data = new LockoutData(); lockMap.put(username, data); } return data; } }