संपादित करें: यह @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);
(...)
अच्छे उदाहरण। +1 – singles
+1 मुझे 'अज्ञात' उपयोगकर्ता का विचार पसंद है, और वादा करता हूं कि मैं इसे अपने कार्यों में उपयोग करूंगा :) – tawfekov
@singles धन्यवाद, यह वह समाधान है जिसे मैं ढूंढ रहा था! –