2011-02-09 13 views
6

यह सुनिश्चित करने के लिए कि मैं अपने सभी नियंत्रकों (मेरे लॉगिन नियंत्रक को छोड़कर) को वैश्विक रूप से सुरक्षित कैसे करूं, यह सुनिश्चित करने के लिए कि मेरा एप्लिकेशन सभी बिंदुओं पर सुरक्षित है (AJAX कॉल के लिए कोई छिपी हुई पिछली नहीं है)। मैंने सोचा कि मैं इसे अपनी बूटस्ट्रैप फ़ाइल में डाल सकता हूं, लेकिन यह सही नहीं लगता है? मैं प्रत्येक नियंत्रक को कोई भी कोड जोड़ने से बचने की कोशिश कर रहा हूं।सभी नियंत्रकों को सुरक्षित करने के लिए Zend_Auth का उपयोग

सुझाव?

abstract class MyController extends Zend_Controller_Action { 
    public function preDispatch(){ 
    // do the logic 
    } 
} 

और अपने नियंत्रकों की अब प्रत्येक केवल विस्तार करने के लिए की जरूरत है:

उत्तर

11

संपादित करें: यह @singles प्रतिक्रिया का पूरक है।

आपको समझना होगा कि 2 अलग-अलग चीजें हैं। एथ और एसीएल। ऑथ आपको बताता है कि उपयोगकर्ता कौन है, और उदाहरण के लिए आप उपयोगकर्ता को लॉग इन कंट्रोलर के लिए कोई ऑथ नहीं कर सकते हैं, और लॉगिन के बाद एक ऑथ पहचान सेट कर सकते हैं। तो Acl प्रणाली हाँ ले/कोई निर्णय प्रमाणीकरण डेटा के आधार पर (प्रयोक्ता आईडी है या भूमिका, प्राधिकरण संग्रहण में संग्रहीत है सकता है।

अच्छा समाधान पर 2 नियंत्रकों प्लगइन्स के लिए (अच्छा में पंजीकृत है बूटस्ट्रैप पर ऑर्डर करें, ऑथ फिर एसीएल)। यदि आप कंट्रोलर प्लगइन्स का उपयोग नहीं करते हैं तो आपको आवश्यकता होने पर प्रत्येक नियंत्रक में एसीएल चेक को कॉल करना होगा। अगर आपको हमेशा इसकी आवश्यकता है, तो प्लगइन का उपयोग करें।

में एथ प्लगइन लागू करने के लिए उदाहरण के लिए एक अज्ञात पहचान सेट करें यदि आपके पास Zend_Auth से कोई पहचान वापसी नहीं है। यह एक वास्तविक एक का एक कोड का टुकड़ा है:

public function preDispatch(Zend_Controller_Request_Abstract $request) 
{ 
    $module = $request->getModuleName(); 
    $controller = $request->getControllerName(); 
    $action = $request->getActionName(); 
    $auth = Zend_Auth::getInstance(); 
    if (!$auth->hasIdentity()) { 
     // set a default anonymous identity 
     $auth->getStorage()->write(array('name' => 'anonymous','role' => 1,)); 
    } 
(...) 

और Acl नियंत्रक प्लगइन के लिए कार्य preDispatch() में भी है। आप प्रत्येक अनुरोधित यूआरएल के लिए एसीएल चेक लॉन्च कर सकते हैं (इसलिए प्रत्येक उपयोगकर्ता अनुरोध के लिए, यहां तक ​​कि AJAX)। यहाँ एक आंशिक टुकड़ा है, तो यह सिर्फ कैसे आप चीजों को संभाल सकता का एक उदाहरण:

public function preDispatch(Zend_Controller_Request_Abstract $request) { 
    $controller = $request->controller; 
    $module = $request->module; 
    $action = $request->action; 
    // here you should code something nice retrieving you Zend_Acl object 
    // with some caching options maybe, building roles, ressources, etc 
    $this->_acl = $this->getAcl(); 
    if (!$this->_acl->isCurrentUserAllowed($module,'see')) { 
     $auth = Zend_Auth::getInstance(); 
    $identity = $auth->hasIdentity('identity')? $auth->getIdentity() : null; 
    if(isset($identity)) { 
      if($identity['name'] == 'anonymous') { 
       // WARNING: avoid infinite redirect loops on login page 
       if (!($request->getControllerName() == 'login' 
        && $request->getActionName()=='login' 
        && $request->getModuleName() == 'default')) { 
         $request->setControllerName('login') 
       ->setActionName('login') 
       ->setModuleName('default'); 
      return; 
(...) 

और इस प्रणाली में पिछले महत्वपूर्ण हिस्सा LoginController जहां सफल लॉगिन के मामले में आप पहचान की रिकॉर्ड initate चाहिए:

(...) 
$auth = Zend_Auth::getInstance(); 
Zend_Session::regenerateId(); 
$storage = $auth->getStorage(); 
$rowobject = $authAdapter->getResultRowObject(null,'passwd'); 
$storage->write((array)$rowobject); 
(...) 
+0

अच्छे उदाहरण। +1 – singles

+0

+1 मुझे 'अज्ञात' उपयोगकर्ता का विचार पसंद है, और वादा करता हूं कि मैं इसे अपने कार्यों में उपयोग करूंगा :) – tawfekov

+0

@singles धन्यवाद, यह वह समाधान है जिसे मैं ढूंढ रहा था! –

0

ठीक है, आप अपने सिस्टम :)

यह Zend_Controller_Action बढ़ा कर प्राप्त किया जा सकता करने के लिए एक प्रवेश बिंदु की जरूरत है, मान लें MyController और आप सुरक्षित हैं।

+1

उस समाधान में, प्रत्येक ऐप में आपको कस्टम नियंत्रक का विस्तार करने की आवश्यकता होगी। मुझे लगता है कि फ्रंट कंट्रोलर प्लगइन बेहतर समाधान होगा - जब आप चाहें तो इसे पंजीकृत कर सकते हैं और मौजूदा कोड के संशोधनों के बिना आप कौन सी ऐप जेडएफ चाहते हैं। – singles

+0

सच है, पूरी तरह से सहमत हैं। एक बार जब आप उन्हें जानते हैं प्लगइन्स जादुई हैं :) अपने समाधान को ऊपर उठाया। – usoban

4

आपको इसके लिए एसीएल प्लगइन लिखना चाहिए और इसे फ्रंट कंट्रोलर में पंजीकृत करना चाहिए। यदि आप प्लगइन के रूप में ऐसी कार्यक्षमता को लागू करते हैं तो आपके पास अपने अगले एप्लिकेशन में इसका उपयोग करने के लिए लचीलापन होगा - प्रत्येक नियंत्रक को आपके कस्टम नियंत्रक से विस्तारित करने की आवश्यकता के बिना।

संसाधन:
1. Front Controller Plugins in Zend Framework - कैसे प्लगइन्स जेडएफ
2. Zend_Acl/Zend_Auth example scenario में काम करते हैं - एसीएल प्लगइन के कई संभावित कार्यान्वयन में से एक।
3. Google - और कई अन्य संसाधन

0

जिस तरह से मैंने इसे एक कार्यान्वयन में किया था, वह मेरे आवेदन पथ में Auth.php नामक फ़ाइल बनाने के लिए था। तब मैं हर नियंत्रक मैं संरक्षित किया जाना चाहता था खोल दिया और माता पिता :: init कॉल करने से पहले विधि init() करने के लिए लाइन

include_once APPLICATION_PATH . '/Auth.php'; 

जोड़ा()।

Auth.php फ़ाइल के लिए, यह मूल रूप से प्रमाणीकृत करने के लिए Zend_Auth का उपयोग करता है। सफलता पर मैं आवेदन में बाद में उपयोग के लिए उपयोगकर्ता की पहचान की बचत होगी

$this->view->assign('myIdentity', Zend_Auth::getInstance()->getIdentity()); 

विफलता मैं प्रवेश पृष्ठ पर पुनर्निर्देशित और इतना है कि प्रवेश पृष्ठ जहां मुझे भेजने के लिए एक बार मैं जानता कुछ पैरामीटर से होकर गुजरेगा पर लॉग इन

यह एक सुरुचिपूर्ण समाधान नहीं है लेकिन यह विश्वसनीय और अपेक्षाकृत तेज़ और कार्यान्वित करने में आसान है।

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