Cron para borrar usuarios inactivos

13/02/2014       Sergio Raposo Vargas       OpenCms, Programación

Cuando implementamos una zona privada con registro, es muy común que muchos usuarios se registren pero nunca lleguen a validar su correo, y por lo tanto podemos tener una base de datos llena de usuarios que no pueden entrar en nuestro sistema. Además, es posible que este mismo usuario más adelante quiera volver a registrarse pero el sistema no le deje porque ya existe dicho usuario.

Para evitar esto crearemos una tarea programada de OpenCms con la que podamos eliminar los usuarios que llevan más de un número  de horas registrados, que no han activado la cuenta y que nunca hicieron login.

Nuestro cron estará preparado para recibir dos parámetros:

  • maxage: Número de horas máximo que permitiremos al usuario estar sin activar la cuenta.
  • ou: Unidad organizativa que queremos aplicar el procedimiento. Esta marcada la búsqueda recursiva por lo que se aplicará a dicha unidad organizativa a sus hijas.

El código fuente de este cron sería:

import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsUser;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.scheduler.I_CmsScheduledJob;

/**
 * Tarea programada que borra usuarios no activados.<p>
 *
 * Parametros:<p>
 * <dl>
 * <dt><code>maxage={time in hours}</code></dt>
 * <dd>Especifica el maximo de tiempo (en horas) que un usuario puede estar en estado inactivo antes de ser borrado por el sistema.</dd>
 * <dt><code>ou</code></dt>
 * <dd>Unidad organizativa de la cual borraremos los usuarios.</dd>
 * </dl>
 *
 * @author Sergio Raposo Vargas. Saga Soluciones.
 *
 */
public class CmsUserCleanupJob implements I_CmsScheduledJob {

    /** Maximum age parameter. */
    public static final String PARAM_MAXAGE = "maxage";
    
    public static final String PARAM_OU = "ou";

    /** The log object for this class. */
    private static final Log LOG = CmsLog.getLog(CmsUserCleanupJob.class);

    /**
     * @see org.opencms.scheduler.I_CmsScheduledJob#launch(CmsObject, Map)
     */
    public String launch(CmsObject cms, Map parameters) throws Exception {

        String maxAgeStr = (String)parameters.get(PARAM_MAXAGE);
        String ou = (String)parameters.get(PARAM_OU);
        if(ou == null)
            ou = "/"; //Por defecto ponemos la unidad raiz
        float maxAge;
        try {
            maxAge = Float.parseFloat(maxAgeStr);
        } catch (Exception e) {
            // en caso de error ponemos por defecto 1 semana
            maxAge = 24f * 7f;
        }

        // calculamos la fecha de expiracion en base a la fecha actual
        long expireDate = System.currentTimeMillis() - (long)(maxAge * 60f * 60f * 1000f);

        // Borramos los usuarios inactivos
        int count = removeInactiveSubscribers(cms, ou, expireDate);

        return "Se han borrado "+count+" usuarios inactivos.";
    }

    /**
     * Borramos los usuarios inactivos de la ou pasada por parametro
     *
     * @param cms CmsObject con el contexto configurado en la tarea programada
     * @param ou Unidad Organizativa donde buscaremos los usuarios
     * @param expireDate Fecha de expiración, si un usuario ha sido creado antes de dicha fecha y esta inactivo sera borrado.
     * @return numero de usuarios borrados
     */
    private int removeInactiveSubscribers(CmsObject cms, String ou, long expireDate) {

        int count = 0;
        try {
            
            List<CmsUser> usuarios = OpenCms.getOrgUnitManager().getUsers(cms, ou, true);
            
           for(CmsUser user: usuarios)
           {
                // Si esta inactivo y nunca ha hecho login, lo consideramos como inactivo
                Boolean inactive = (!user.isEnabled() && user.getLastlogin()==0);
                if (inactive) {
                    // Miramos si ha superado el tiempo maximo permitido antes de ser borrado
                    if (user.getDateCreated() < expireDate) {
                        // Usuario mas antiguo de la fecha especificada, por lo tanto, lo borramos
                        cms.deleteUser(user.getName());
                        count++;
                    }
                }
            }
        } catch (CmsException e) {
            // Error borrando usuario
            if (LOG.isErrorEnabled()) {
                LOG.error("Error borrando usuario inactivo del sistema. ", e);
            }
        }
        return count;
    }
}
 Cron, Zona privada, Borrado Usuarios Inactivos