2016-03-10 12 views
7

मेरा प्रश्न है, वितरित वेब एप्लिकेशन में RedisOperationSessionRepository का उपयोग करके रेडिस स्टोर से वैध सत्र प्राप्त करना संभव है। (मेरा मतलब है कि मैं इसे रेडिस स्टोर में डालने के लिए स्पष्ट कोड नहीं लिखना चाहता हूं और फिर बाद में इसे पढ़ना चाहता हूं, मैं समझना चाहता हूं कि फ्रेमवर्क या spring-data-redis लाइब्रेरी प्रदान करता है)।वसंत सत्र डेटा रेडिस - मान्य सत्र प्राप्त करें, रेडिस स्टोर से वर्तमान उपयोगकर्ता

मुझे पता है कि वसंत Redis सत्र और सर्वर के पुनरारंभ बहाल करने के लिए (के रूप में यह Redis के द्वारा समर्थित है) भी लॉगिन की रक्षा करता है, तो सत्र अभी भी मान्य है

मैं करने के लिए है के लिए देख रहा हूँ कार्यक्षमता में से एक में सक्षम है हूँ वर्तमान में आवेदन में उपयोगकर्ताओं में सभी संभावित लॉग प्राप्त करें। मुझे SessionRegistryImpl, और इस विधि से अवगत है। लेकिन मैंने देखा कि इस विधि को रेडिस द्वारा समर्थित नहीं किया गया है और सर्वर पुनरारंभ करने के बाद, उपयोगकर्ताओं में लॉग इन नहीं किया जाता है।

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

स्प्रिंग सत्र 1.1.0, स्प्रिंग सत्र उपयोगकर्ता नाम से ढूंढने की कार्यक्षमता में से एक है।

  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

मैंने कोशिश की और यह वास्तव में मुझे वैध सत्र परिणाम देता है, लेकिन समस्या यह मैं अभी भी सभी मौजूदा मान्य उपयोगकर्ता नाम हैं जो इस अनुप्रयोग का उपयोग कर रहे हैं पता करने की जरूरत है। (मुझे नहीं पता कि रेडिस स्टोर का उपयोग करके उन्हें कैसे प्राप्त किया जाए, फिर मैं रेडिस में स्टोर कर सकता हूं और उन्हें प्राप्त कर सकता हूं, लेकिन मैं जानना चाहता हूं कि बेहतर दृष्टिकोण है या नहीं)।

यह कोड का टुकड़ा है, इस तरह से मैं वर्तमान उपयोगकर्ता सिस्टम का उपयोग कर रहे कई उपयोगकर्ताओं में से एक से वर्तमान उपयोगकर्ता प्राप्त कर सकता हूं, अगर मुझे सत्र आईडी पता है।

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; 
      } 
     } 
    } 

अब मैं तर्क से ऊपर का उपयोग सभी मौजूदा उपयोगकर्ता प्राप्त करने के लिए कर सकते हैं, लेकिन फिर मैं सभी वैध सत्र आईडी है, जो मैं कैसे Redis की दुकान से प्राप्त करने के लिए पता नहीं है चाहिए।

नए अद्यतन: https://github.com/spring-projects/spring-session/issues/255 यहाँ इस लिंक में, मैं शायद सब सत्र आईडी प्राप्त कर सकते हैं और RedisOperationSessionRepository सक्रिय सत्रों के लिए देखो, लेकिन प्रदर्शन के मुद्दों में परिणाम हो सकता है।

मुझे यकीन नहीं है कि मैंने खुद को स्पष्ट कर दिया है, लेकिन क्या हम वसंत सत्र एपीआई का उपयोग करके रेडिस को कुछ नहीं बता सकते हैं, बस मुझे सभी वैध सत्र और उनके वर्तमान उपयोगकर्ता जो वर्तमान में लॉग इन हैं। (अंतिम पहुंच के आधार पर समय या ऐसा कुछ)।

धन्यवाद

उत्तर

0

Redis मूल रूप से एक कुंजी-मान की दुकान है और इस तरह क्वेरी सुविधाओं प्रदान नहीं करता है।

हालांकि, आप KEYS अनुरोध का उपयोग कर सभी सत्रों को सूचीबद्ध करने में सक्षम होना चाहिए, फिर उन्हें अंतिम गतिविधि के आधार पर फ़िल्टर करें, लेकिन आपके द्वारा उल्लिखित जिथब मुद्दे में उल्लिखित दोषों के साथ।

आपको शायद डेटास्टोर में उपयोगकर्ताओं की गतिविधियों को लॉगिंग करने पर विचार करना चाहिए जो रिलेशनल पूछताछ का समर्थन करता है, रेडिस को एक तेज सत्र स्टोर के रूप में रखते हुए।

+0

हाँ वर्तमान में मैं KEYS का उपयोग करके सभी सत्र सूचीबद्ध कर रहा हूं, और यह महंगा संचालन है। शायद एक विकल्प डेटाबेस में उपयोगकर्ता के खिलाफ ध्वज रखना है, अगर वह लॉग इन करता है या नहीं और फिर इस ध्वज और उपयोगकर्ता नाम के आधार पर, FindByUsernameSessionRepository का उपयोग किया जा सकता है। –

+0

'कुंजी *' वह अनुरोध है जिसे मैं ढूंढ रहा था, अगर यह किसी की भी मदद करता है – user1521567

संबंधित मुद्दे