2012-08-03 22 views
7

मैं this थ्रेड का जिक्र कर रहा था, और Rob Winch (स्प्रिंग सिक्योरिटी लीड) द्वारा दूसरी अंतिम पोस्ट में, उन्होंने उल्लेख किया कि हम कर सकते हैं sessionRegisty की पहुंच है:वसंत सुरक्षा - क्या मेरे आवेदन के अंदर सत्र रजिस्ट्री प्राप्त करने का कोई तरीका है (समवर्ती फ़िल्टर को स्पष्ट करने के बिना)

<session-management> 
    <concurrency-control session-registry-alias="sessionRegistry"/> 
</session-management> 

इसलिए, मैं web.xml में HttpSessionEventPublisher फिल्टर रजिस्टर और मेरे <http> खंड में ऊपर सेटिंग निर्दिष्ट। नहीं मुझे क्या करना इस जोड़ें:

<beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" /> 

और मेरी कक्षा में, मुझे लगता है इस तरह sessionRegistry का एक उदाहरण इंजेक्षन:

@Autowired 
private SessionRegistry sessionRegistry 

इस तरह मैं एक के लिए सत्र पता लगाने के लिए कोशिश कर रहा हूँ है उपयोगकर्ता:

List<SessionInformation> userSessions = sessionRegistry.getAllSessions(username,false); 
     for (SessionInformation userSession : userSessions){ 
      userSession.expireNow(); 
     } 

प्रिंसिपल उपयोगकर्ता का उपयोगकर्ता नाम है। डिबगिंग पर, sessionRegistry चर के principals और sessionids चर खाली हैं। क्या मैं यहां कुछ भी गलत कर रहा हूं, या krams's blog द्वारा उल्लिखित चरणों को करने का एकमात्र तरीका है?

+0

क्या काम नहीं करता है? – Xaerxess

+0

@Xaerxess - सत्र रजिस्ट्री चर जो डाला गया है इसमें कोई सत्र आईडी या प्रमाणीकरण नहीं है। ध्यान दें कि मैंने सत्र रजिस्ट्री बीन को स्पष्ट रूप से परिभाषित नहीं किया है – Daud

+0

क्या आप 'सत्र रजिस्ट्री' तक पहुंचने वाले वर्ग का कोड पोस्ट कर सकते हैं? रजिस्ट्री खाली होने पर आप कैसे जांचते हैं? – Xaerxess

उत्तर

1

टिप्पणी के लिए बहुत लंबा, इसलिए मैंने जवाब दिया।

  1. पर (log4j.properties लाइन log4j.logger.org.springframework.security=DEBUG के लिए जोड़) मुड़ें स्प्रिंग सुरक्षा डिबगिंग। यह ऐसी समस्याओं में मानक प्रक्रिया होनी चाहिए, क्योंकि डिबगिंग प्रिंट कई आसान जानकारी दिखाती है जो समस्याएं थीं।

  2. आप डिबग सकते हैं कि SessionRegistryImpl अंदर public void registerNewSession(String sessionId, Object principal) विधि प्रवेश करने के बाद कहा जाता है? यदि ऐसा नहीं है तो इसका मतलब है कि HttpSessionEventPublisher सही तरीके से सेट नहीं है।

  3. आप अपनी कक्षा में @Autowired private SessionRegistry sessionRegistry; का उपयोग करते हैं, है ना?

  4. संपादित करें: क्या आप रजिस्ट्री में कोई प्रिंसिपल हैं या नहीं?

    List<Object> userSessions = sessionRegistry.getAllPrincipals(); 
    

    जहां Object एस प्रधानाचार्य उदाहरण हैं जिनका आप उपयोग करते हैं।

+3

यह एक उत्तर के रूप में चिह्नित है, लेकिन जवाब क्या है? मैं देखना चाहता हूं कि क्या मैं समेकन-नियंत्रण सक्षम किए बिना सत्र रजिस्ट्री का उपयोग कर सकता हूं। – Eyal

+0

@Eyal, क्या आपको समाधान मिला? – msangel

+0

नहीं। मैंने सत्र रजिस्ट्री का उपयोग करने और इसके बजाय अपने स्वयं के HttpSessionListener एक्सटेंशन लिखने के विचार को छोड़ दिया। – Eyal

2

ठीक है आप सत्र रजिस्ट्री को स्वचालित कर सकते हैं। कुछ भी गलत नहीं है। मैंने SessionInformation ट्रैक करने के लिए इसका इस्तेमाल किया और UserPrincipal

+0

लेकिन मैंने इसके लिए पर्याप्त कॉन्फ़िगर किया है? – Daud

+0

यदि आप मिश्रित विन्यास (जैसे एक्सएमएल और एनोटेशन) की तरह उपयोग कर रहे हैं, तो यह सही है। इंटरफ़ेस के साथ ऑटोवायर सत्रफैक्टरी: '@Autowired निजी सत्र रजिस्ट्री सत्र रजिस्ट्री;'। क्योंकि आपके प्रदत्त लिंक पर, वर्ग में स्वायत्त बीन 'सत्र रजिस्ट्रीआईएमएल' है। Sessionfactory के लिए आपका xml configuartion सही है। –

+0

इसे एक ही सेटिंग के साथ काम करने के लिए मिला .. – Daud

2

यह केवल अगर मैं सत्र-रजिस्ट्री-रेफरी,-सत्र पर रजिस्ट्री-उर्फ बदल मेरे लिए काम किया और फिर परिभाषित डिफ़ॉल्ट impl:

<security:session-management> 
    <security:concurrency-control max-sessions="10" session-registry-ref="sessionRegistry"/> 
</security:session-management> 

<bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/> 
1

खैर यह वसंत सुरक्षा का कौन सा संस्करण निर्भर करता है आप उपयोग।

वसंत सुरक्षा 3 में।0 यह इस प्रकार विन्यास के लिए पर्याप्त है:

<security:session-management> 
    <security:concurrency-control max-sessions="1"/> 
</security:session-management> 

क्योंकि आंतरिक रूप से प्रयोग किया जाता है वहाँ वर्ग ConcurrentSessionControlStrategy जिस पर sessionRegistry वस्तु registerNewSession invokes।

वसंत सुरक्षा 3.2 यह अलग है और आपको अधिक वर्बोज कॉन्फ़िगरेशन का उपयोग करना होगा।

<beans:bean id="sas" class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy"> 
    <beans:constructor-arg> 
    <beans:list> 
     <beans:bean class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy"> 
     <beans:constructor-arg ref="sessionRegistry"/> 
     <beans:property name="maximumSessions" value="1" /> 
     </beans:bean> 
     <beans:bean class="org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy"> 
     <beans:constructor-arg ref="sessionRegistry"/> 
     </beans:bean> 
    </beans:list> 
    </beans:constructor-arg> 
</beans:bean> 

<beans:bean id="sessionRegistry" 
    class="org.springframework.security.core.session.SessionRegistryImpl" /> 

एक नया सत्र के पंजीकरण में sessionRegistryRegisterSessionAuthenticationStrategy कक्षा में किया जाता है: वहाँ sessionRegistry डेटा के साथ भर के लिए Spring Security reference doc सबसे महत्वपूर्ण हिस्सा में एक उदाहरण पीछा कर रहा है है।

उम्मीद है कि यह आपकी मदद करेगा।