bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

Rimuovere gli utenti inattivi di Liferay 7 con Groovy

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.

Commenti
Aggiungi Commento
Luigi Candita
Molto interessante. Potenzialmente si potrebbero usare script in Groovy anche per fare un init dei dati. Es. Creare programmaticamente organizations.
Inviato il 09/06/17 11.34.