2008-09-28 13 views
10

मैं github पर पाए गए restful_authentication के वर्तमान संस्करण का उपयोग कर रहा हूं और मुझे अजीब सत्र के मुद्दों का एक गुच्छा है। ऐसा लगता है कि सर्वर किसी भी तरह से उपयोगकर्ताओं को सत्र असाइन नहीं कर रहा है, यह नहीं होना चाहिए। यह केवल तभी होता है जब अवरोध में लॉग आउट/लॉग इन किया जाता है।अनजान सत्र स्थायी प्रमाणीकरण के साथ समस्या का अपहरण

यहां एक उदाहरण है। सर्वर पर कोई सत्र सक्रिय नहीं होने के कारण, मैं उपयोगकर्ता ए के साथ किसी खाते में लॉग इन करता हूं, दूसरी मशीन पर, मैं उपयोगकर्ता बी के साथ लॉग इन करता हूं। फिर उपयोगकर्ता बी से लॉग आउट करते समय, लॉगआउट रीडायरेक्ट होने के कुछ समय बाद, मैं लॉग इन हो जाऊंगा उपयोगकर्ता ए। इस बिंदु से, मैं साइट पर नेविगेट करना जारी रख सकता हूं जैसे कि मैंने उस उपयोगकर्ता के रूप में लॉग इन किया था! लॉग के माध्यम से मैंने जो कुछ देखा है वह यह है कि जब यह अपहरण होता है, सत्र आईडी समान नहीं होती है। उपयोगकर्ता ए दोनों सत्रों में लॉग इन है, लेकिन सत्र आईडी पूरी तरह से अलग हैं। यह क्या हो सकता है इसका एक उदाहरण है। मैं इस मुद्दे को विश्वसनीय रूप से पुन: उत्पन्न नहीं कर सकता क्योंकि यह प्रतीत होता है यादृच्छिक।

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

अद्यतन यहां अपमानजनक विधि है जो सीधे restful_authentication से आई है।

# Accesses the current user from the session. 
# Future calls avoid the database because nil is not equal to false. 
def current_user 
    @current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie) unless @current_user == false 
end 

उत्तर

2

मुझे नहीं पता कि यह इतना जवाब है कि यह एक काम है। मैंने जो कुछ किया वह कुकी आधारित सत्रों पर स्विच हो गया था और सब कुछ सुचारू रूप से काम कर रहा है।

3

यह तब हो सकता है जब आप (या जो आरामपूर्ण_ प्रमाणीकरण लिखते हैं) वर्तमान उपयोगकर्ता को कक्षा चर में कैश कर रहे हों। मैंने "User.current_user" के उपयोग की वकालत करने वाले लेखों का एक समूह देखा है, लेकिन चूंकि वर्गों को अनुरोधों पर कैश किया जाता है, इससे सत्र टैनटिंग हो सकती है।

+0

यह एक व्यावहारिक उत्तर की तरह लगता है, लेकिन मैं अभी भी कैश वैरिएबल में स्टोरेज से current_user ऑब्जेक्ट के संग्रहण को हटाने के बाद इस अपहरण व्यवहार को पुन: उत्पन्न करने में सक्षम था। – Jared

+0

यदि आप क्लास वैरिएबल में वर्तमान उपयोगकर्ता को कैश करते हैं तो आपको बस हर अनुरोध से पहले इसे साफ़ करना याद रखना होगा। कुछ ऐसा: 'फिल्टर से पहले: clean_user; पहले_फिल्टर: – Arsen7

0

क्या यह साइट दूरस्थ है? क्या आप उसी नेटवर्क पर दो अलग-अलग कंप्यूटरों पर लॉग इन कर रहे हैं?

+0

प्रमाणीकृत करें, मैं अपने लैपटॉप पर और मेरे सर्वर पर उत्पादन में स्थानीय रूप से दोनों में चल रहा हूं। आप एक ही नेटवर्क पर 2 खातों के बारे में सही हैं। मैं अलग मशीनों पर अलग-अलग ब्राउज़रों में ऐसा कर रहा हूं। – Jared

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