@RequestMapping(method = RequestMethod.POST)
	public @ResponseBody JsonResponse maintenanceAuth(@RequestParam(value = "email", required=true) String email,
			@RequestParam(value = "password", required=true) String password,
			@RequestParam(value = "recaptcha_challenge_field", required=false) String challenge,
			@RequestParam(value = "recaptcha_response_field", required=false) String response,
			HttpServletRequest paramHttpServletRequest) {
		JsonResponse jsonResponse = new JsonResponse();
		
		if (isMaxAttempts(paramHttpServletRequest)) {
			String remoteAddr = paramHttpServletRequest.getRemoteAddr();
			ReCaptchaResponse reCaptchaResponse = recaptcha.checkAnswer(remoteAddr, challenge, response);
			if (!reCaptchaResponse.isValid()) {
				jsonResponse.setCaptchaError(context.getMessage("error.bad.captcha", null, Locale.getDefault()));
				return jsonResponse;
			}
		}
		
		if (credentialsValid(email, password)) {
			jsonResponse.setResponse(paramHttpServletRequest.getRequestURL());
			paramHttpServletRequest.getSession().setAttribute(SESSION_ATTR_IS_AUTHENTICATED, true);			
		} else {
			Integer attempts = (Integer)paramHttpServletRequest.getSession().getAttribute(SESSION_ATTR_LOGIN_ATTEMPT);
			if (attempts == null) {
				attempts = 0;
			} 
			paramHttpServletRequest.getSession().setAttribute(SESSION_ATTR_LOGIN_ATTEMPT, ++attempts);
			if (attempts >= MAX_LOGIN_ATTEMPTS) {
				jsonResponse.setResponse("showCaptcha");	
			}			
	    	jsonResponse.appendError(context.getMessage("error.bad.credentials", null, Locale.getDefault()));
		}
		return jsonResponse;
	}