Cron para borrar usuarios inactivos
Thu Feb 13 11:16:25 CET 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;
}
}