2012-02-18 12 views
9

मैं ऐसे एप्लिकेशन पर काम कर रहा हूं जिसमें कई उप-अनुप्रयोग हैं और मैं 30 मिनट की निष्क्रियता के बाद ऑटो लॉगआउट लागू करना चाहता हूं। मैं लॉगिन के साथ आपके AuthController है और कस्टम/लॉगिन और/लॉगआउट मार्गों Bootstrap.php का उपयोग कर के साथ-साथ एक सामने नियंत्रक प्लगइन है कि इस तरह दिखता है पर मैप किए गए कार्यों लॉगआउट:निष्क्रियता के बाद ज़ेंड फ्रेमवर्क स्वचालित लॉगआउट

class Plugin_SessionTrack extends Zend_Controller_Plugin_Abstract { 

    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 

     $employeeSession = new Zend_Session_Namespace('employeeSession'); 
     $employeeSession->setExpirationSeconds(10); 

    } 
} 

मैं PHP और Zend के लिए नया हूँ , 10 सेकंड के बाद सत्र में वास्तव में क्या हो रहा है? मैंने परीक्षण के लिए इसे कम सेट किया है। मैं क्या करना चाहता हूं कि अगर फ्रंट कंट्रोलर प्लगइन के माध्यम से अंतिम अनुरोध का समय 30 मिनट पहले से अधिक था, सत्र को नष्ट कर दें और उपयोगकर्ता को लॉग आउट करें और उन्हें/लॉगिन पर रीडायरेक्ट करें।

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

शायद एक कुकी की आवश्यकता है? मुझे वास्तव में लॉगआउट एक्शन शुरू करने की आवश्यकता नहीं है, अगली बार जब उपयोगकर्ता अनुरोध करता है तो इसे संभाला जा सकता है, अगर उन्होंने पिछले आधे घंटे में कुछ भी नहीं किया है तो सत्र नष्ट हो गया है और वे लॉग आउट हैं, जिसका अर्थ है अगर मैं 45 मिनट तक चलता हूं तो मेरी स्क्रीन अभी भी वही दिखती है, लेकिन अगर मैं एक लिंक पर क्लिक करता हूं या एक फॉर्म को आज़माता हूं और सबमिट करता हूं तो मैंने इसे भेज दिया/लॉगिन किया। मैं बाद में कुछ प्रकार की जेएस उलटी गिनती चेतावनी के बारे में चिंता कर सकता हूं।

संपादित करें: यहाँ मेरी बूटस्ट्रैप अगर किसी को भी यह देखना चाहता है:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    /** 
    * Custom routes: 
    * 
    * /login 
    * /logout 
    */ 
    protected function _initRoutes() 
    { 

     $router = Zend_Controller_Front::getInstance()->getRouter(); 

     $loginRoute = new Zend_Controller_Router_Route('login', array('controller' => 'auth', 'action' => 'login')); 

     $logoutRoute = new Zend_Controller_Router_Route('logout', array('controller' => 'auth', 'action' => 'logout')); 

     $routesArray = array('login' => $loginRoute, 'logout' => $logoutRoute); 

     $router->addRoutes($routesArray); 

    } 

    protected function _initPlugins() 
    { 

     $frontController = Zend_Controller_Front::getInstance(); 
     $frontController->registerPlugin(new Plugin_SessionTrack()); 

    } 
} 
+0

सबसे पहले 'निष्क्रियता' को परिभाषित करें। हम php में देख सकते हैं सर्वर अनुरोध है। मुझे वास्तव में यह सुझाव देने से नफरत है, लेकिन आप गतिविधि की निगरानी के लिए जावास्क्रिप्ट का उपयोग करना चाहेंगे और जब यह 'टाइम आउट' लॉगआउट विधि को कॉल करेगा। नेमस्पेस की समाप्ति आपको जो चाहिए वह प्रतीत नहीं होती है। – RockyFord

+0

निष्क्रियता का अर्थ है कि उपयोगकर्ता ने एक फॉर्म पोस्ट नहीं किया है, वे नियंत्रक में कार्रवाई नहीं कर रहे हैं। असल में वे "कीबोर्ड से दूर" हैं। इस घर के उप अनुप्रयोगों को काफी डेटा संचालित किया जाता है, इसलिए यह स्पष्ट होना चाहिए कि यदि वे नियंत्रक (क्रियाएं) को मार नहीं रहे हैं तो वे एप्लिकेशन का उपयोग नहीं कर रहे हैं। –

उत्तर

11

जब आप Zend_Session::setExpirationSeconds(10) कहते हैं, कुछ भी नहीं है वास्तव में सत्र के बाद 10 सेकंड के समय से प्रति हो रहा है।

यह कॉल Zend_Session को कॉल करने के समय से time() + $seconds पर समाप्ति के लिए सत्र नामस्थान को आंतरिक मान को चिह्नित करने का कारण बनता है। प्रत्येक बार Zend_Session शुरू होता है, यह जांचता है कि क्या कोई सत्र डेटा समाप्ति के लिए चिह्नित किया गया है, और यदि यह देखने के लिए कि क्या समाप्ति समय या हॉप गिनती पारित हो गई है या नहीं। यदि ऐसा है, तो प्रश्न में सत्र डेटा प्रारंभिकरण पर सेट नहीं है, और इसलिए आपके आवेदन द्वारा अब तक पहुंच योग्य नहीं है।

यदि आप प्रत्येक अनुरोध की शुरुआत में यह कॉल करते हैं, तो इसे प्रत्येक पृष्ठ लोड पर कई सेकंड तक सत्र के जीवन को लंबा करना जारी रखना चाहिए।

ध्यान रखें कि यदि php.ini में सत्र सेटिंग्स 15 मिनट के बाद सत्र समाप्त करने के लिए सेट हैं, 60 मिनट के बाद समाप्त होने के लिए नामस्थान सेट करना 15 मिनट के PHP के सत्र जीवनकाल को ओवरराइड नहीं करेगा। आप अपने application.ini फ़ाइल में PHP के सत्र निर्देशों में ऐसे समायोजन कर सकते हैं।

नामस्थान पर समाप्ति सेट करने से पूरे सत्र को नष्ट किए बिना कुछ सत्र डेटा को स्वचालित रूप से हटाने का लाभ भी मिलता है।

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

आप Zend_Auth पर भी देखना चाहते हैं जिसका उपयोग आप सत्र में एक पहचान को जारी रखने के लिए कर सकते हैं। यह पहचान एक साधारण बूलियन मान से कुछ भी हो सकती है जो इंगित करती है कि क्या वे लॉग इन हैं, एक पूर्ण उड़ाए गए उपयोगकर्ता ऑब्जेक्ट पर जो Zend_Acl_Role_Interface लागू करता है।ज़ेंड ऑथ को भी आसानी से बढ़ाया जाता है ताकि आप प्रत्येक उदाहरण के लिए अलग-अलग नामस्थानों का उपयोग कर एक ही समय में सक्रिय Zend_Auth सत्र सक्रिय कर सकें, और आपके कस्टम ऑथ क्लास में विभिन्न सत्र नामस्थानों पर अलग-अलग समय सीमा निर्धारित हो सकती है।

मुझे उम्मीद है कि आपके प्रश्न का उत्तर देने में मदद मिलेगी, अगर आपने जो कहा है उस पर आपके कोई प्रश्न हैं तो टिप्पणी करने में संकोच न करें।

संपादित करें:

मैं निम्नलिखित कोड का परीक्षण किया और इसे सफलतापूर्वक निर्धारित समय के बाद मेरे Zend_Auth पहचान समाप्त हो गई है। मैंने इसे 60 सेकंड के साथ कम परीक्षण किया और पेज लोड करने के लिए 60 सेकंड प्रतीक्षा करने के बाद, अब मेरे पास और पहचान नहीं थी और "लॉग आउट" किया गया था। आप इसे अपने सत्र ट्रैक प्लगइन में जोड़ सकते हैं।

<?php 
$auth = Zend_Auth::getInstance(); 

if ($auth->hasIdentity()) { // user is logged in 
    // get an instance of Zend_Session_Namespace used by Zend_Auth 
    $authns = new Zend_Session_Namespace($auth->getStorage()->getNamespace()); 

    // set an expiration on the Zend_Auth namespace where identity is held 
    $authns->setExpirationSeconds(60 * 30); // expire auth storage after 30 min 
} 
+0

https://gist.github.com/8b2ae80e23543a34ca8a मेरी लॉगिन कार्रवाई है। मैं सक्रिय निर्देशिका के माध्यम से उन्हें प्रमाणित करने के लिए Zend_Auth एडाप्टर का उपयोग कर रहा हूं। अगर वे साइट पर आखिरी कार्रवाई की गई थी तो 30 मिनट पहले> अगर वे अपने उपयोगकर्ता के लॉगआउट को मजबूर करने में सक्षम होने के अलावा इसे सभी काम कर चुके हैं। –

+0

बाद में आपके आवेदन में, आप यह जांचने के लिए क्या करते हैं कि कोई उपयोगकर्ता लॉग इन है या नहीं? क्या आप सिर्फ यह देखने के लिए जांचते हैं कि लेखक की पहचान शून्य नहीं है? मेरा अद्यतन उत्तर देखें जो दिखाता है कि Zend_Auth पहचान को कैसे समाप्त किया जाए। आशा है कि आप यही चाहते थे। – drew010

+0

हाँ बाद में अगर मुझे यह देखने की ज़रूरत है कि वे लॉग इन हैं या नहीं, तो मुझे केवल इडेंटिटी() प्राप्त करें और देखें कि यह कैसा दिखता है। तो 30 मिनट में समाप्त होने के लिए $ लेखों को सेट करते समय यह पहले से अच्छा हो जाएगा IDentity() शून्य हो जाता है? –