public User authenticate(String login, String password, HttpServletRequest request) throws BusinessException {
		
		// TODO ver um padrõa de projeto para isso tipo fabrica.
		User user = null;
		user = userDAO.findOneByField("login", "=", login);
		
		try {
			// Usuário informou um login valido
			if(user != null) { 
				// Caso a autenticação esteja correta
				if(this.applyHash(password, user.getSaltAgent()).equals(user.getPassword())) {
					
					if(!checkStatus(user)) {
						this.registerAccess(AccessEntry.TYPE_BLOCKED, login, password, request);
						throw new BusinessException(MessageBundleUtils.getInstance().getMessage("login.error.acessDenied.blocked"), FacesMessage.SEVERITY_ERROR);
					} else {
						this.registerAccess(AccessEntry.TYPE_SUCESSED, login, password, request);
						return user;
					}
					
				// O usuário errou apenas a senha
				} else {
					this.registerAccess(AccessEntry.TYPE_DENIED, login, password, request);
					if(this.updateLoginAttempt(user)) {
						throw new BusinessException(MessageBundleUtils.getInstance().getMessage("login.error.acessDenied.gotBlocked"), FacesMessage.SEVERITY_ERROR);
					} else {
						// TODO arrumar um jeito de parametrizar mensagens pelo addMensage/
						// Ter cuidado com validação de crosside script
						throw new BusinessException("Acesso Negado: dados inválidos, restão apenas " + user.getLoginAttempt() + " tentativas", FacesMessage.SEVERITY_ERROR);
					}
				}
			}
		} catch (EncryptionException e) {
			e.printStackTrace();
			throw new BusinessException(MessageBundleUtils.getInstance().getMessage("system.error.generic"), e);
		}
		
		// Não existe usuário com o login informado
		this.registerAccess(AccessEntry.TYPE_DENIED, login, password, request);
		throw new BusinessException(MessageBundleUtils.getInstance().getMessage("login.error.acessDenied"), FacesMessage.SEVERITY_ERROR);
		
	}