"Se ci sono due o più modi di fare una cosa,
e uno di questi modi può condurre a una catastrofe,
allora qualcuno la farà in quel modo.

(Edward Murphy)

Come sincronizzare gli utenti Drupal con Moodle

Lun, 06/02/2017 - 14:23 -- arturu

Recentemente per la scuola per cui lavoro ho cambiato la piattaforma di e-learning migrando da Docebo a Moodle. Anni fa, quando installai Docebo sviluppai un connettore per far autenticare gli utenti in automatico attraverso l'utenza Drupal, molto comodo per gli utenti (la verità è che i colleghi mi avrebbero linciato se gli avessi dato altre credenziali). Qualche giorno fa dopo aver installato Moodle si è ripresantata la stessa problematica. Leggendo la documentazione di Moodle sono stato piacevolmente sorpreso dall'apprendere che esso possiede numerosi metodi per la sincronizzazione degli utenti con una sorgente esterna e questo è stato un ulteriore motivo che mi ha convinto della qualità di Moodle. Ho voluto scrivere questo articolo per codividere la conoscenza acquisita, inoltre, non è un articolo tecnico o di difficile comprensione, basta conoscere come effettuare una query su database.

Metodi di autenticazione in Moodle.

Moodle mette a disposizione numerosi metodi di autenticazione.

Sinceramente il primo che ha attirato la mia attenzione è stato il modulo SSO, ma facendo delle ricerche ho notato che:

Non avendo molto tempo a disposizione per mettermi sullo sviluppo su uno dei moduli già citati, ho dovuto ripiegare su un più modesto connettore: il Database esterno.

Sincronizzazione degli utenti Drupal con Moodle con "Database Esterno"

Nelle impostazioni del database esterno troviamo alcune basilari impostazioni:

Successivamente i campi anagrafici da sincronizzare:

Quindi, l'unico problema da risolvere è quello di presentare a Moodle un'unica tabella con tutte le informazioni che desideriamo sincronizzare. Su Drupal le informazioni dell'anagrafica e dei ruoli si trovano su diverse tabelle - come è giusto che sia, poi dipende da come abbiamo sviluppato il framework, infatti, questi campi non sono nativi del CMF - infatti, è buona pratica che la tabella user contenga dati minimali quali: username, password, mail, lingua e simili. Detto ciò, l'unico modo per presentare questi dati in una sola tabella, come richiesto da Moodle, è una view SQL (da non confondere con le view di drupal).

Una mezzora di lavoro ed il risultato è una view che:

  • filtra gli utenti in base al ruolo, logicamente non vogliamo che tutte le tipologie di utenze possano accedere all'elearning, ma solo alcune, io ho scelto i ruoli: administrator, Preside, DSGA, Capo redattore, Redattore, Docente, Alunno, Segreteria e Collaboratore
  • filtra gli utenti con un profilo attivo
  • recupera l'elenco dei ruoli associati per ogni utenza
  • recupera il plesso associato ad ogni utenza
  • recupera l'anagrafica dell'utenza
  • recupera dati come: username, passwod (crittografata), email, lingua, la pagina del profilo personale e simili

Di seguito la view SQL

 

CREATE OR REPLACE VIEW view_moodle_users_sync AS
SELECT 
	users.name AS username, 
    users.pass AS password, 
    field_data_field_cognome.field_cognome_value AS cognome,
    field_data_field_nome.field_nome_value AS nome,
    users.mail AS email,
    CONCAT(field_data_field_cap.field_cap_value,' ',field_data_field_citt_.field_citt__value,' ',field_data_field_provincia.field_provincia_value) AS citt_,
    'Italia' AS nazione,
    users.language AS lingua,
    CONCAT('https://icmarvasivizzone.gov.it/user/',users.uid) AS pagina_web,
    field_data_field_codice_fiscale.field_codice_fiscale_value AS codice_identificativo,
    GROUP_CONCAT(taxonomy_term_data.name) AS istituzione,
    GROUP_CONCAT(role.name) AS dipartimento,
    field_data_field_telefono.field_telefono_value AS telefono,
    field_data_field_indirizzo.field_indirizzo_value AS indirizzo
FROM users
INNER JOIN users_roles
	ON users.uid = users_roles.uid 
INNER JOIN role
	ON users_roles.rid = role.rid
INNER JOIN field_data_field_cognome
	ON (
    	field_data_field_cognome.entity_type = 'user'
        AND users.uid = field_data_field_cognome.entity_id
    )
INNER JOIN field_data_field_nome
	ON (
    	field_data_field_nome.entity_type = 'user'
        AND users.uid = field_data_field_nome.entity_id
    )
INNER JOIN field_data_field_cap
	ON (
    	field_data_field_cap.entity_type = 'user'
        AND users.uid = field_data_field_cap.entity_id
    )
INNER JOIN field_data_field_citt_
	ON (
    	field_data_field_citt_.entity_type = 'user'
        AND users.uid = field_data_field_citt_.entity_id
    )
INNER JOIN field_data_field_provincia
	ON (
    	field_data_field_provincia.entity_type = 'user'
        AND users.uid = field_data_field_provincia.entity_id
    )
INNER JOIN field_data_field_codice_fiscale
	ON (
    	field_data_field_codice_fiscale.entity_type = 'user'
        AND users.uid = field_data_field_codice_fiscale.entity_id
    )
INNER JOIN field_data_field_plesso_public
	ON (
    	field_data_field_plesso_public.entity_type = 'user'
        AND users.uid = field_data_field_plesso_public.entity_id
    )
INNER JOIN taxonomy_term_data
	ON field_data_field_plesso_public.field_plesso_public_tid = taxonomy_term_data.tid
INNER JOIN field_data_field_telefono
	ON (
    	field_data_field_telefono.entity_type = 'user'
        AND users.uid = field_data_field_telefono.entity_id
    )
INNER JOIN field_data_field_indirizzo
	ON (
    	field_data_field_indirizzo.entity_type = 'user'
        AND users.uid = field_data_field_indirizzo.entity_id
    )
WHERE 
	users.status = 1
    AND (
        role.name = "administrator" 
        OR role.name = "Preside"
        OR role.name = "DSGA"
        OR role.name = "Capo Redattore"
        OR role.name = "Redattore"
        OR role.name = "Docente"
        OR role.name = "Alunno"
        OR role.name = "Segreteria"
        OR role.name = "Collaboratore"
    )
GROUP BY users.uid

Non ci resta che:

  • configurare il modulo di autenticazione di Moodle, un esempio è nelle immagini precedenti;
  • fare il test delle impostazioni;
  • attivare il modulo.

Ciao :)