2016-03-10 17 views
7

La mia domanda è, in un'applicazione web distribuita è possibile ottenere le sessioni valide da Redis Store usando RedisOperationSessionRepository. (Voglio dire che non voglio scrivere codice esplicito per metterlo in Redis store e poi leggerlo in seguito, voglio capire se la struttura o la libreria spring-data-redis lo fornisce).Spring Session Data Redis - Ottieni sessioni valide, Utente corrente da Redis Store

Sono consapevole del fatto che la primavera Redis è in grado di ripristinare le sessioni e riavvio del server anche preservare il login se la sessione è ancora valido (in quanto è sostenuta da Redis)

Una delle funzionalità che sto cercando è quello di ottenere tutti gli accessi possibili agli utenti attualmente presenti nell'applicazione. Sono a conoscenza di SessionRegistryImpl e questo metodo. ma quello che ho notato che questo metodo non è supportato da Redis e dopo il riavvio del server, gli utenti di accesso non vengono restituiti.

public List<Object> getAllPrincipals() { 
    return new ArrayList<Object>(principals.keySet()); 
} 

Una delle funzionalità che posso provare è da Spring Session 1.1.0, Spring session find by username.

  1. http://docs.spring.io/spring-session/docs/1.1.0.M1/reference/html5/guides/findbyusername.html
  2. https://spring.io/blog/2015/11/17/spring-session-1-1-0-m1-released

ho provato e che anzi mi restituisce valido risultato della sessione, ma il problema è ho ancora bisogno di conoscere tutti gli attuali nomi utente validi che utilizzano questa applicazione. (Non so come ottenerli usando Redis Store, di nuovo posso archiviare Redis e prenderli, ma voglio sapere se c'è un approccio migliore).

Questo è il pezzo di codice, questo è il modo in cui posso ottenere l'utente corrente da uno dei molti utenti che stanno attualmente utilizzando il sistema, se conosco l'id di sessione.

final Session session = redisOperationsSessionRepository.getSession(sessionid); 

    final Object obj = session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY); 
    if (obj instanceof SecurityContext) { 
     final SecurityContext context = (SecurityContext) obj; 
     final Authentication authentication = context.getAuthentication(); 
     if (authentication != null) { 
      final Object principal = authentication.getPrincipal(); 
      if (principal != null && principal instanceof CurrentUser) { 
       return (CurrentUser) principal; 
      } 
     } 
    } 

Ora posso usare la logica di cui sopra per ottenere tutto l'utente corrente, ma ancora una volta dovrei tutti gli ID di sessione validi, che non so come andare da negozio Redis.

Nuovo aggiornamento: https://github.com/spring-projects/spring-session/issues/255 Qui in questo link, posso probabilmente ottenere tutti gli ID di sessione e cercare sessioni attive in RedisOperationSessionRepository, ma potrebbe comportare problemi di prestazioni.

Non sono sicuro se mi sono spiegato, ma non possiamo dire qualcosa a Redis utilizzando l'API di sessione di primavera, dammi solo tutte le sessioni valide e il loro utente corrente che sono attualmente in accesso. (Basato sull'ultimo accesso tempo o qualcosa del genere).

ringraziarvi

risposta

0

Redis è fondamentalmente un negozio di valori-chiave e non fornisce tali caratteristiche di interrogazione.

Tuttavia, dovresti essere in grado di elencare tutte le sessioni utilizzando una richiesta KEYS, quindi filtrarle in base all'ultima attività, ma con gli svantaggi menzionati nel problema github che hai menzionato.

Probabilmente si dovrebbe considerare di registrare le attività degli utenti in un datastore che supporta l'interrogazione relazionale, mantenendo Redis come un archivio di sessioni veloce.

+0

sì attualmente sto elencando tutte le sessioni utilizzando i tasti, ed è un'operazione costosa. probabilmente un'opzione è quella di avere un flag contro l'utente nel database da memorizzare se è loggato o meno e quindi basato su questo flag e username, può essere usato FindByUsernameSessionRepository. –

+0

'KEYS *' è la richiesta che stavo cercando, nel caso in cui aiuti qualcuno – user1521567

Problemi correlati