2012-07-25 18 views
6

आईएम CakePHP 2.2.1 का उपयोग कर रहा है और मैं Auth Component के साथ अपने उपयोगकर्ता प्रमाणीकरण को बेहतर बनाने की कोशिश कर रहा हूं। जब उपयोगकर्ता एकाधिक स्थानों से लॉग इन करने का प्रयास करते हैं तो उन्हें व्यक्तिगत सत्र आईडी मिलती हैं, जो मैं करना चाहता हूं वह पुराने सत्र को मारता है ताकि उपयोगकर्ता एक ही समय में एकाधिक स्थानों से लॉग इन नहीं कर सके।केकेपीएचपी चेक सत्र डेटाबेस

मैंने परिवर्तित किया कि केकपीएचपी इस पोस्ट cakephp prevent user login from multiple locations at the same time का उपयोग करके अपने सत्र कैसे सहेजता है, लेकिन जब कोई नया बनाया गया है तो पुराने सत्र को कैसे मारना है, इस पर कोई जवाब नहीं दिया गया था।

मैंने सत्र मॉडल बनाने और रिकॉर्ड का चयन करने के लिए इसका उपयोग करने के बारे में सोचा लेकिन मुझे यकीन नहीं है कि यह एक सुरक्षित मार्ग है या नहीं।

मैं Session Component पर केकपीएचपी दस्तावेज के माध्यम से भी पढ़ता हूं और केकसेशन डेटासोर्स उम्मीद करता हूं कि एक संकेत हो सकता है लेकिन मैं कुछ भी नहीं ढूंढ पाया।

किसी भी सलाह की सराहना की जाएगी।

उत्तर

6

आम तौर पर, आप डेटाबेस से सत्र हैंडलिंग स्विच करना चाहते हैं, इसलिए जब आप एक ही session_id के साथ उसी उपयोगकर्ता लॉग का पता लगाते हैं तो आप पुराने सत्रों को हटा सकते हैं।

कदम, आप यह अनुमान लगा रहे हैं:

  1. स्विच सत्र डेटाबेस से निपटने

    Configure::write('Session.save', 'database'); 
    
  2. cake_sessions तालिका

    cd app   
    Console/cake schema create Sessions 
    

    तब आप निम्न देख होगा बनाएँ:

    Cake Schema Shell 
    --------------------------------------------------------------- 
    
    The following table(s) will be dropped. 
    cake_sessions 
    Are you sure you want to drop the table(s)? (y/n) 
    [n] > y 
    Dropping table(s). 
    cake_sessions updated. 
    
    The following table(s) will be created. 
    cake_sessions 
    Are you sure you want to create the table(s)? (y/n) 
    [y] > y 
    Creating table(s). 
    cake_sessions updated. 
    End create. 
    
  3. आप अपने सत्र डेटाबेस में

    $this->Session->write('user_id', 123456); 
    
  4. दोहराएं के माध्यम से data क्षेत्र द्वारा user_id करने के लिए session_id बाँध और अगर एक ही user_id आपकी साइट में प्रवेश बंद है और एक अलग session_id साथ पंक्ति को हटा मान लिया जाये।

    दुर्भाग्य से, केकेपीएचपी dataserialize() -ed डेटा के रूप में स्टोर करता है। आपको हटाने के लिए seralized data में निहित user_id मिलान करने के लिए cake_sessions तालिका पर प्रत्येक पंक्तियों के माध्यम से या तो फिर से शुरू करना होगा।

    या, बस आप एक विचार देने के लिए, आपको निम्न एसक्यूएल एक अनुमानित विधि के लिए जुड़े पंक्ति को हटाने के लिए उपयोग कर सकते हैं:

    DELETE FROM `cake_sessions` WHERE `cake_sessions`.`data` LIKE '%123456%'; 
    
  5. इस तरह पुराने उपयोगकर्ता जो पुराने session_id होगा है लॉग इन उपयोगकर्ता के रूप में साइट पर जारी रखने में सक्षम नहीं है।

+0

तो मूल रूप से केकपीएचपी डिफ़ॉल्ट सत्र कॉम्पोनेंट या ऑथकंपोनेंट के साथ उपयोगकर्ता सत्र का पता लगाने का कोई तरीका नहीं है? जैसा कि मैंने उपरोक्त कहा है कि पहले से ही उन बिंदुओं पर जहां सत्र डेटाबेस में लिखे जा रहे हैं, मैं बस उपयोगकर्ता को प्रमाणीकृत करने से पहले रिकॉर्ड्स तक पहुंचने का प्रयास कर रहा हूं और यह सुनिश्चित नहीं था कि केकेपीएचपी ने इसका समर्थन किया है या अगर आपको मैन्युअल रूप से करना होगा हटाई गई क्वेरी। – Dastca

+0

आपको इसे मैन्युअल रूप से करना है। केकेपीएचपी "बॉक्स के बाहर" इस ​​सुविधा का समर्थन नहीं करता है। – uzyn

+0

ठीक है, मुझे – Dastca

3

यह करने के लिए अपने उपयोगकर्ता तालिका में एक session_id क्षेत्र बनाते हैं, और उसके बाद वे के लिए लॉग इन उपयोगकर्ताओं को वर्तमान सत्र आईडी स्टोर करने के लिए इस का उपयोग किया जाएगा अन्य तरीके से।

प्रत्येक पृष्ठ पर session_id वर्तमान session_id के बराबर नहीं है, तो सभी सत्र डेटा हटाएं और उन्हें लॉगिन पृष्ठ पर रीडायरेक्ट करें क्योंकि यह पुराने सत्र डेटा या समवर्ती सत्र होना चाहिए।

नोट: यह सत्यापित करने के बाद कि उपयोगकर्ता तालिका में सत्र वर्तमान सत्र है, सत्र सत्र को पुन: उत्पन्न करते समय भी उपयोगकर्ता तालिका में session_id फ़ील्ड को अद्यतन करना याद रखें, या हर बार जब सत्र पुन: उत्पन्न होता है तो उपयोगकर्ता लॉग आउट हो जाएगा।

+0

पता करने के लिए धन्यवाद, मुझे लगता है कि Uzyns समाधान मेरी परियोजना को थोड़ा बेहतर बनाता है लेकिन मैं इस समाधान को पसंद करता हूं। LIKE के साथ डेटा की तलाश में "बदसूरत" क्वेरी के उपयोग के बिना यह बहुत साफ और अधिक सरल है। धन्यवाद – Dastca

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

  • कोई संबंधित समस्या नहीं^_^