2012-03-22 11 views
6

काम करने के लिए शिरो के SecurityUtils.getSubject() को समझने का मूल तरीका यह है कि यह वर्तमान में निष्पादित थ्रेड से जुड़ा विषय है। हालांकि, यह सिर्फ टोमकैट जैसे सर्वलेट कंटेनर के साथ बाधाओं में प्रतीत होता है जो सेवा अनुरोधों के लिए थ्रेड पूल का उपयोग कर रहा है।शिरो एक बहु थ्रेडेड वातावरण में

यदि टॉमकैट अनुरोधों को संभालने के लिए थ्रेडए का उपयोग कर कहता है, तो SecurityUtils.getSubject() पर किसी भी कॉल को ठीक काम करना चाहिए। लेकिन, जैसे ही थ्रेडबी का चयन किया जाता है, उपयोगकर्ता खो जाता है, getSubject शून्य लौटाता है और प्रमाणीकृत अब गलत है। यह तब भी है जब उपयोगकर्ता अभी भी लॉग इन है।

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

तो, क्या मेरे पास शिरो गलत तरीके से कॉन्फ़िगर किया गया है? ऐसा लगता है कि 'वर्तमान उपयोगकर्ता' को वर्तमान धागे की तुलना में कुछ और लंबे समय तक चलना चाहिए। मैं उम्मीद करता हूं कि यह सत्र-आधारित हो। मुझे पता है कि शिरो के पास सत्र प्रबंधन है, लेकिन मैंने पाया है कि सभी उदाहरणों में, यह getSubject पर कॉल करके वर्तमान उपयोगकर्ता को प्राप्त करने के लिए कहता है, जो थ्रेडकॉन्टेक्स्ट को देखता है। क्या मैं कुछ भूल रहा हूँ?

उत्तर

12

तो, यह पता चला है कि मेरे पास शिरो सही ढंग से कॉन्फ़िगर नहीं किया गया था। मेरे पास एक वेब ऐप है, फिर भी मैं कोड में सुरक्षा प्रबंधक स्थापित कर रहा था। इसके परिणामस्वरूप सुरक्षा प्रबंधक केवल एक निश्चित धागे पर स्थापित किया जा रहा था। जब तक उसी धागे द्वारा अनुरोधों की सेवा की जाती थी, तब तक यह ठीक काम करता था। लेकिन जैसे ही टॉमकैट ने एक अलग धागा चुना, उपयोगकर्ता अनधिकृत दिखाई दिया।

शिरो के पास वेब ऐप्स के लिए एक फ़िल्टर है जो इस परिदृश्य को संभालता है और उपयोगकर्ता को प्रत्येक आने वाले अनुरोध पर बाध्य करता है। कोड में सुरक्षा प्रबंधक करने के बजाए आपको अपना ऐप कॉन्फ़िगर करना चाहिए:

<context-param> 
    <param-name>shiroConfigLocations</param-name> 
    <param-value>classpath:auth.ini</param-value> 
</context-param> 

<!-- Shiro Environment Listener --> 
<listener> 
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> 
</listener> 

<!-- Shiro Filter Configuration --> 
<filter> 
    <filter-name>ShiroFilter</filter-name> 
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>ShiroFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

इस अच्छी तरह से लिखित प्रतिक्रिया के साथ रिपोर्ट करने के लिए धन्यवाद! –

+0

मेरे पास 'SecurityUtils.getSubject()' के बारे में कुछ सवाल है। चूंकि टॉमकैट कंटेनर में एक थ्रेड पूल है, इसलिए एक धागा बहु-विषयों से जुड़ा हो सकता है? – znlyj

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