Recentemente mi sono trovato a dover gestire la sincronizzazione degli utenti di Liferay 7 con un server LDAP e durante le prove ho dovuto ripetutamente rimuovere gli utenti importati.
Come sapete, per rimuovere un utente di Liferay bisogna prima disattivarlo e poi cancellarlo; purtroppo, quando gli utenti iniziano ad essere 5000, l'operazione potrebbe diventare un tantino tediosa se fatta dal pannello di controllo; non potevo farlo nemmeno via SQL perché avrei dovuto pulire anche tutte le tabelle collegate.
Non avendo voglia/tempo di sviluppare un plugin ad hoc per risolvere il problema, ho provato a realizzare il tutto mediante uno script Groovy che può comodamente essere incollato ed eseguito nel pannello di controllo di Liferay.
E' pertanto sufficiente collegarsi a Liferay ed accedere al menu Pannello di Controllo -> Configurazione -> Gestione Server e cliccare sul tab Script; dopodiché è sufficiente incollare il seguente codice Groovy ed eseguirlo.
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.Sort;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
long companyId = ...;
// Conteggio degli utenti inattivi
int number = UserLocalServiceUtil.searchCount(companyId, null, WorkflowConstants.STATUS_INACTIVE, null);
out.println("Utenti non attivi: " + number);
// Recupero degli utenti inattivi e riconteggio per verifica
Hits hits = UserLocalServiceUtil.search(companyId, null, WorkflowConstants.STATUS_INACTIVE, null, -1, -1, new Sort("userId", false));
out.println("Utenti non attivi: " + hits.getLength());
for(int i = 0; i < hits.getLength(); i++) {
Document document = hits.doc(i);
User user = UserLocalServiceUtil.fetchUser(GetterUtil.getLong(document.get("entryClassPK")));
out.print("[" + (i + 1) + "/" + hits.getLength() + "] ");
if(user != null) {
out.println(user.getPrimaryKey() + " - " + user.getFullName() + " (" + user.getEmailAddress() + ")");
// Decommentare per cancellare l'utente
// UserLocalServiceUtil.deleteUser(user);
} else {
out.println("L'utente " + document.get("entryClassPK") + " non esiste!");
}
}
Lo script è concettualmente molto semplice: innanzitutto conta gli utenti inattivi in base alle informazioni presenti su Lucene e lo fa con 2 approcci diversi per sicurezza. Dopodichè cicla su ogni singolo utente, ne stampa alcuni dati e lo cancella (ovviamente dovete decommentare la riga).
Una volta eseguito lo script, il controllo torna immediatamente al browser ma la cancellazione degli utenti procede in background; quindi commentate la riga della cancellazione e rieseguitelo più volte per seguire il procedere della cancellazione.