public AuthenticationUser validate(String login, String password, String entidad)
      throws SecurityException, ValidationException {
    AuthenticationUser user = null;
    validateParameters(login, password);
    LDAPAuthenticationUser attributesUser = null;

    try {
      LDAPDef ldapDef = RepositoryLDAP.getInstance(entidad).getLDAPInfo();
      if (log.isDebugEnabled()) {
        log.debug("LDAPDef [" + ldapDef + "] con el log [" + log + "]");
      }
      if (ldapDef.getLdapEngine() == 0) {
        throw new SecurityException(SecurityException.ERROR_AUTHENTICATION_POLICY_NOTFOUND);
      }

      // String dn = ldapDef.getLdapUser();
      String attrID =
          LDAPRBUtil.getInstance(null).getProperty(LDAP_ATTRIBUTES + ldapDef.getLdapEngine());
      String attributes[] = parseAttributes(attrID);
      String passwordDecrypt = CryptoUtils.decryptPasswordLDAP(ldapDef.getLdapPassword());
      LdapConnection conn = new LdapConnection();
      LdapConnCfg ldapConfig = LdapConfigUtils.createLdapConnConfig(ldapDef);
      ldapConfig.setProvider(1);
      String dn = ldapConfig.getUser();
      conn.open(ldapConfig, dn, passwordDecrypt);

      LdapSearch search = getSearch(login, conn, ldapDef, attributes);
      attributesUser = getUserAttributes(search, attributes);
      attributesUser.setGuidStringFormat(LdapBasicFns.formatGuid(conn, attributesUser.getGuid()));
      if (log.isDebugEnabled()) {
        log.debug("attributesUser [" + attributesUser + "] con el log [" + log + "]");
      }

      conn.close();

      // se valida al usuario logueado y su contraseña
      validateUserPassword(ldapDef, attributesUser.getDn(), password);

      Integer userId = userVerification(attributesUser, entidad);
      //			Integer deptId = connectionVerification(attributesUser, passwordDecrypt,
      //					ldapDef, attributes, entidad);

      Integer deptId = null;

      // List deptList = connectionVerification(attributesUser, passwordDecrypt, ldapDef,
      // attributes, entidad);
      // obtiene los departamentos del usuario
      List deptListLDAP =
          connectionVerification(attributesUser, passwordDecrypt, ldapDef, attributes, entidad);
      // obtenemos las oficinas del usuario
      List deptList = getUserDeptList(userId, entidad, deptListLDAP);
      // obtenemos los ids de los grupos a los que pertenece el usuario
      List groupList =
          getListGroupOfUser(attributesUser, passwordDecrypt, ldapDef, attributes, entidad);

      user = new AuthenticationUser();

      if (deptList != null && deptList.size() > 0) {
        deptId = (Integer) deptList.get(0);
        user.setDeptList(deptList);
      }

      user.setId(userId);
      user.setName(attributesUser.getFullName());
      user.setDeptid(deptId);
      user.setDeptIdOriginal(deptId);
      user.setGroupList(groupList);

    } catch (NamingException e) {
      throw new SecurityException(SecurityException.ERROR_USER_NOTFOUND);
    } catch (SecurityException e) {
      throw e;
    } catch (Exception e) {
      throw new SecurityException(SecurityException.ERROR_USER_NOTFOUND);
    }

    return user;
  }
  public AuthenticationUser validate(String userDn, String entidad)
      throws SecurityException, ValidationException {
    AuthenticationUser user = null;
    LDAPAuthenticationUser attributesUser = null;

    LdapConnection conn = new LdapConnection();
    try {
      // String decodedDn = CryptoUtils.getDecodeDn(userDn);
      String decodedDn = userDn;
      LDAPDef ldapDef = RepositoryLDAP.getInstance(entidad).getLDAPInfo();
      if (log.isDebugEnabled()) {
        log.debug("LDAPDef [" + ldapDef + "] con el log [" + log + "]");
      }
      if (ldapDef.getLdapEngine() == 0) {
        throw new SecurityException(SecurityException.ERROR_AUTHENTICATION_POLICY_NOTFOUND);
      }

      // String dn = ldapDef.getLdapUser();
      String attrID =
          LDAPRBUtil.getInstance(null).getProperty(LDAP_ATTRIBUTES + ldapDef.getLdapEngine());
      String attributes[] = parseAttributes(attrID);
      String passwordDecrypt = CryptoUtils.decryptPasswordLDAP(ldapDef.getLdapPassword());
      LdapConnCfg ldapConfig = LdapConfigUtils.createLdapConnConfig(ldapDef);
      String dn = ldapConfig.getUser();
      ldapConfig.setProvider(1);
      conn.open(ldapConfig, dn, passwordDecrypt);

      LdapSearch search = getSearchSSO(decodedDn, conn, ldapDef, attributes);
      attributesUser = getUserAttributes(search, attributes);
      attributesUser.setGuidStringFormat(LdapBasicFns.formatGuid(conn, attributesUser.getGuid()));
      if (log.isDebugEnabled()) {
        log.debug("attributesUser [" + attributesUser + "] con el log [" + log + "]");
      }

      Integer userId = userVerification(attributesUser, entidad);
      //			Integer deptId = connectionVerification(conn, attributesUser, ldapDef, attributes,
      // entidad);

      Integer deptId = null;

      List groupList = new ArrayList();
      List deptList =
          connectionVerification(conn, attributesUser, ldapDef, attributes, entidad, groupList);
      // se deja comentado este punto porque es nuevo y soluciona el error detectado con el boton
      // cambiar oficina por SSO

      deptList = getUserDeptList(userId, entidad, deptList);

      user = new AuthenticationUser();

      if (deptList != null && deptList.size() > 0) {
        deptId = (Integer) deptList.get(0);
        user.setDeptList(deptList);
      }

      user.setId(userId);
      user.setName(attributesUser.getFullName());
      user.setDeptid(deptId);
      user.setGroupList(groupList);

      return user;

    } catch (NamingException e) {
      throw new SecurityException(SecurityException.ERROR_USER_NOTFOUND);
    } catch (SecurityException e) {
      throw e;
    } catch (Exception e) {
      throw new SecurityException(SecurityException.ERROR_USER_NOTFOUND);
    } finally {
      try {
        conn.close();
      } catch (Exception e) {
        if (log.isDebugEnabled()) {
          log.debug("Error al cerrar conexión LDAP", e);
        }
      }
    }
  }