2013-02-27 11 views
6

Nella mia applicazione posso modificare i permessi e i ruoli utente nel back-end.Forza riautenticazione dopo che le autorizzazioni utente sono state modificate

Quando un utente ha effettuato l'accesso e rimuovo un ruolo dell'utente, l'utente può comunque accedere a contenuti a cui non è più consentito l'accesso, perché gli manca il ruolo. Le modifiche diventano effettive solo quando l'utente si autentica di nuovo con logout/login.

Quindi la mia domanda è: posso accedere alla sessione di un utente connesso (non a me)? So che posso accedere alla mia sessione e distruggerla, il che mi costringe a effettuare nuovamente il login. Ma voglio ottenere la sessione di qualsiasi utente che ha effettuato l'accesso. È possibile? Non sono riuscito a trovare alcuna risorsa al riguardo.

Io uso PdoSessionStorage con symfony2.1 e fosuserbundle.

+0

anche chiesto qui, senza risposta. http://stackoverflow.com/questions/14184484/how-to-administratively-invalidate-a-session-that-used-remember-me-option – MDrollette

+0

@MDrollette Penso che verrà risposto a questa domanda. Penso che l'unica soluzione potrebbe essere un gestore di sessioni personalizzato –

+0

Si tratterebbe semplicemente di memorizzare l'ID utente insieme all'ID di sessione nella tabella di sessione. Non sembra particolarmente difficile, ma non sono nemmeno sicuro del miglior approccio. – MDrollette

risposta

9

Imposta come utente la classe Symfony\Component\Security\Core\User\EquatableInterface.

Se si restituisce false dal metodo isEqualTo(), l'utente verrà riautentato. Utilizzare questo metodo per confrontare solo le proprietà che, se modificate, dovrebbero forzare la riautenticazione - i ruoli nel tuo caso.

+0

+1 Ok, lo capisco. Dove devo fare questo controllo? Devo farlo su ogni richiesta? –

+0

Basta che la tua classe utente implementa l'interfaccia. Sarai costretto ad implementare il metodo 'isEqualTo()'. Il resto è gestito da Symfony. –

+0

Grande che funziona!) –

-1

Si può ovviare a questo problema, seguendo un approccio simile a quello che ho fatto:

  1. Quando utente accede al sistema, memorizzare tutte le autorizzazioni in seduta insieme a un checksum di tali autorizzazioni.
  2. Archiviare lo stesso checksum in un database o su disco, contro tale ID utente
  3. Ogni volta che l'utente effettua una richiesta, verificare che il checksum sul disco corrisponda a quello in sessione per quell'utente. Se è diverso, ricaricare le autorizzazioni nella sessione dell'utente
  4. Quando si modificano le autorizzazioni, aggiornare il checksum nel database (o sul disco) memorizzato su quell'utente. Questo attiverà una risincronizzazione alla successiva richiesta.
+0

Hm sembra interessante ma complesso. È una specie di helpdesk che stai sviluppando? –

+0

@artworkad シ non è molto complesso, utilizza componenti di base di symfony2 come il contenitore di servizi, il contesto di sicurezza e l'oggetto richiesta per determinare cosa fare con le autorizzazioni. – JamesHalsall

+0

@Jaitsu, la soluzione integrata di Symfony è * così * semplice, riderai istericamente. Vedi la mia risposta. ;) –

Problemi correlati