मैं 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
यह एक व्यावहारिक उत्तर की तरह लगता है, लेकिन मैं अभी भी कैश वैरिएबल में स्टोरेज से current_user ऑब्जेक्ट के संग्रहण को हटाने के बाद इस अपहरण व्यवहार को पुन: उत्पन्न करने में सक्षम था। – Jared
यदि आप क्लास वैरिएबल में वर्तमान उपयोगकर्ता को कैश करते हैं तो आपको बस हर अनुरोध से पहले इसे साफ़ करना याद रखना होगा। कुछ ऐसा: 'फिल्टर से पहले: clean_user; पहले_फिल्टर: – Arsen7