
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:
- il modulo drupal https://www.drupal.org/project/moodle_sso è in fase di sviluppo ed ha problemi di sicurezza
- il modulo https://www.drupal.org/project/moodle è stato dichiarato obsoleto
- il modulo https://www.drupal.org/project/moodle_connector non fa da autenticazione
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 :)