Comprensione della gestione della sessione di Drupal e dell'autenticazione dell'utente


16

Ho un requisito in cui, devo sostituire l'autenticazione utente predefinita con l'autenticazione di un server centrale, cioè un server SSO.
Con il debug di Drupal sono venuto a sapere che tutta la gestione della sessione avviene in includes/session.incarchivio. Voglio fare l'autenticazione come mostrato nell'immagine:

schiocco

SCENARIO: Login
I dettagli dei passaggi sarebbero:

  1. Sostituisci il modulo di accesso per inviare il nome utente e la password al server SSO ( non su Drupal , ma su .NET).
  2. Autenticare l'utente sul server SSO utilizzando il database di quel sito; e rispondi a una pagina PHP personalizzata del mio sito Web (o a un modulo di un modulo?).
  3. Utilizzando la risposta, identifica l'utente nella tabella degli utenti e crea una sessione per quell'utente senza controllare la password (poiché ciò significherebbe una doppia autenticazione). Per impostazione predefinita, Drupal imposta un cookie con nome di $insecure_session_namevariabile e con valore $sid. Voglio che Drupal non imposti il ​​cookie qui, invece invii i valori delle variabili al server SSO.
  4. Il server SSO prenderà i valori, creerà un cookie e lo rilascerà nel dominio principale domain.com(per ricordare entrambi my websitee si sso servertrovano sul sottodominio del dominio principale, che anche in non in Drupal). Quindi, il sito drupal può accedere utilizzando quel cookie.

So che è una domanda difficile, sto solo cercando suggerimenti su come dovrei iniziare? come si suol dire "non dovresti hackerare il nucleo". Quindi, le mie domande sono:

  1. Dove devo cercare per capire in che modo l'autenticazione Drupal e la gestione delle sessioni funzionano in modo approfondito?
  2. C'è un modo in cui potrei chiamare le funzioni includes/session.incusando gli hook (come dicono i commenti con le funzioni "solo per uso interno / da non modificare")?

NOTA: userò lo stesso metodo per registrare l'utente, in modo che il record rimanga nel database centrale del server SSO. E durante ciò inserirà una password indesiderata per lo stesso utente nel database del sito Drupal (poiché la password non verrà controllata durante l'accesso).


Hai bisogno di un vero SSO (accedi a un sito e sei connesso a tutti i siti) o ti stai semplicemente autenticando con un sistema esterno?
mpdonadio

@MPD Voglio un vero SSO, che richiederà l'accesso in un sito e -> autenticazione dello stesso utente su tutti i siti (potrebbe non essere su Drupal.
AjitS

@AjitS se lo hai implementato con successo puoi per favore inserire una risposta dettagliata. sto usando user_login_finalize ma mi è stato detto a causa di problemi GDPR non posso memorizzare i dettagli in Drupal.
Jignesh Rawal,

Risposte:


17

Drupal supporta l' autenticazione esterna . Esistono molti moduli di autenticazione alternativi per Drupal, come OpenID (incluso nel core), OAuth Connector o LDAP . Ulteriori informazioni su come funziona l'autenticazione Drupal; il migliore sarebbe guardare i moduli OpenID e OAuth e al modulo di login principale inviare callback. Ma, AFAIK, iniziano sempre la normale sessione di Drupal dopo un'autenticazione riuscita.

Per la gestione delle sessioni, Drupal si collega alla gestione delle sessioni PHP e registra i propri gestori. Il back-end della sessione Drupal è esso stesso collegabile, è possibile impostare la session_incvariabile sul percorso di un file fornendo implementazioni alternative delle funzioni trovate includes/session.inc. Il modulo memcache lo utilizza per archiviare la sessione in memcached.

Per riferimento, il modulo OpenID gestisce l'autenticazione corretta in openid_authentication()cui si autodefinisce e chiama il gestore di invio del modulo di accesso dell'utente (ad es. user_login_submit()). Questo gestore di invio in sé è semplice, carica l'utente correttamente autenticato user_load()nella $uservariabile globale , quindi chiama user_login_finalize()quale sessione di handle, timestamp di accesso nella usertabella e richiama hook_user_login()implementazioni.

Un'altra opzione è l'uso della user_external_login_register()funzione. La funzione accederà a un utente esterno. Se necessario, crea anche un utente locale. Se avete bisogno di un maggiore controllo sulla creazione utente locale, si può sempre usare user_save(), user_set_authmaps(), user_login_submit()e user_external_load()da voi chiamata personalizzati, utilizzando user_external_login_register()come modello di ciò che deve essere fatto.


2
Questo è praticamente perfetto. Il lato Drupal di accedere agli utenti esterni è sorprendentemente facile. Il sollevamento pesante (se presente) si interfaccia effettivamente con il sistema esterno.
mpdonadio

@MPD Trovare il contrario, nel mio caso particolare. Sistema esterno = servizio web JSON = roba relativamente semplice. Comportamento drupale = cambiamento imprevedibile da una versione all'altra = difficile da morire e nessuna diagnostica utile quando le cose si rompono.
Trejkaz,

1

L'APi user_authenticate () potrebbe tornare utile qui.

3.Utilizzando la risposta, identifica l'utente nella tabella degli utenti e crea una sessione per quell'utente senza controllare la password (poiché ciò significherebbe una doppia autenticazione). Per impostazione predefinita, Drupal imposta un cookie con nome di $insecure_session_namevariabile e con valore $sid. Voglio che Drupal non imposti il ​​cookie qui, invece invii i valori delle variabili al server SSO.

EDIT: una volta che il server SSO ritorna con true, utilizza questa API per accedere all'utente che si occuperà automaticamente delle sessioni per te. Penso che sia meglio se usi user_authenticate()invece di creare sessioni da solo. Non dovrebbe costituire un problema anche se si tratta di una doppia autenticazione, purché sia ​​fornita una p-assowrd valida.

Non sono sicuro di 4. Vuoi che il cookie sia visibile in entrambi i domini? In tal caso, in settings.php inizializzare $cookie_domainsul dominio. Quindi i cookie nel sito secondario saranno disponibili nel sito padre.


Grazie per la vostra risposta. Non posso usarlo user_authenticateperché non è necessario che l'autenticazione avvenga sul sito Drupal. Posso generare la sessione chiamando drupal_session_generate()e drupal_session_regenerate()dal file session.inc. Hai capito bene i requisiti per i cookie .. vedi la modifica.
AjitS

@indrock Controlla quel link. User_authenticate ti consentirà di accedere a un nome utente e password forniti corretti. Al passaggio 3 quando si verifica che nome utente e passaggio siano corretti sul server SSO, utilizzare questa API per accedere all'utente. Ma dovresti avere la password memorizzata su Drupal. In questo modo sarà molto più semplice rispetto al core di hacking.
GoodSp33d
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.