@Override
	public void allowAttempt(String username) throws UserLockedOutException {
		
		if(username == null) {
			logger.debug("Null username.");
			return;
		}
		
		UserLockoutStatus status = lockoutMap.get(username);
		
		if(status == null) {
			logger.debug("No lockout status found for " + username);
			return;
		}
		
		if(status.getIncorrectAttempts() < allowedIncorrectAttempts) {
			logger.debug("User " + username + " tried " 
					+ status.getIncorrectAttempts() + "/" 
					+ allowedIncorrectAttempts + " allowed attempts.");
			return;
		}
		
		Date now = new Date();
		
		if(now.after(status.getNextAttemptAllowed())) {
			logger.debug("Timer expired, user " + username + " can attempt changes again.");
			lockoutMap.remove(username);
			return;
		}

		logger.info("User " + username + " used all their attempts. Locked out.");
		if(logger.isDebugEnabled()) {
			Date next = status.getNextAttemptAllowed();
			long diff = (next.getTime() - now.getTime()) / 1000;
			logger.debug("--> next change allowed in " + diff + " seconds.");
		}

		throw new UserLockedOutException("User " + username + " locked out.");
	}