मैंने ज़ेन फ्रेमवर्क पर अपना आवेदन आधारित किया है। मैं प्रमाणीकरण के लिए Zend_Auth
का उपयोग कर रहा हूं, लेकिन मुझे यकीन नहीं है कि Zend_Acl
मेरे लिए काम करेगा क्योंकि, स्पष्ट रूप से, मैंने जो उदाहरण देखे हैं वे मेरी आवश्यकताओं के लिए बहुत सरल हैं या मुझे भ्रमित करते हैं।क्या ज़ेंड एसीएल मेरी ज़रूरतों को पूरा करता है?
मैं अपने आवेदन में तत्वों के बारे में सोच रहा हूं क्योंकि संसाधन और इन संसाधनों के पास विशेषाधिकार हो सकते हैं। संसाधन विशेषाधिकार वाली भूमिकाएं गतिशील रूप से उपयोगकर्ताओं को असाइन की गई हैं। मैं इस जानकारी को सामान्यीकृत टेबल में संग्रहीत कर रहा हूं।
- उपयोगकर्ता एक भूमिका
- एक भूमिका कई संसाधन हो सकता है
- संसाधन कई विशेषाधिकार
भूमिकाओं हो सकता है वास्तव में सिर्फ कोई पदानुक्रम के साथ संसाधन विशेषाधिकार का संग्रह कर रहे हैं। संसाधन का एक उदाहरण 'पृष्ठ' होगा। प्रत्येक व्यक्ति पेज देख सकता है, लेकिन एक प्रमाणित उपयोगकर्ता को पृष्ठों के साथ कुछ और करने के लिए 'एड', 'एडिट', या 'डिलीट' विशेषाधिकारों की आवश्यकता होगी।
क्या ज़ेंड एसीएल के साथ यह जाल है? क्या मैं एसीएल को इस तरह से सोच रहा हूं कि मेरे लिए समस्याएं पैदा हो रही हैं?
मेरे समाधान
Typeonerror श्रेय दिया जाता है, लेकिन यहाँ मेरे विशिष्ट समाधान है।
मैं अपने उपयोग को आसान बनाने के Zend_Acl
बढ़ाया क्योंकि मैं केवल वर्तमान उपयोगकर्ता की भूमिका लोड:
class My_Acl extends Zend_Acl
{
protected $_role_id;
public function setRole($role_id)
{
$this->_role_id = $role_id;
return $this->addRole($role_id);
}
public function getRole()
{
return $this->_role_id;
}
public function deny($resource, $privilege)
{
return parent::deny($this->_role_id, $resource, $privilege);
}
public function allow($resource, $privilege)
{
return parent::allow($this->_role_id, $resource, $privilege);
}
public function isAllowed($resource, $privilege)
{
return parent::isAllowed($this->_role_id, $resource, $privilege);
}
}
एसीएल मैं एक प्रश्न जो resource
, privilege
, और role_id
कॉलम रिटर्न पर अमल से भर दें। role_id
कॉलम परिणाम सेट में शून्य है यदि उपयोगकर्ता की भूमिका में वह विशेषाधिकार नहीं है।
$acl = new My_Acl();
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$userInfo = $auth->getStorage()->read();
$acl->setRole($userInfo->role_id);
} else {
$acl->setRole('');
}
// QUERY HERE
foreach ($privileges as $privilege) {
if (!$acl->has($privilege['resource'])) {
$acl->addResource($privilege['resource']);
}
if (is_null($privilege['role_id'])) {
$acl->deny($privilege['resource'], $privilege['privilege']);
} else {
$acl->allow($privilege['resource'], $privilege['privilege']);
}
}
मैं आपके उदाहरण में उपयोगकर्ता, भूमिका और संसाधन के स्तर देख रहा हूं। मेरे पास उपयोगकर्ता, भूमिका, संसाधन, विशेषाधिकार है। उपयोगकर्ता की एक भूमिका होती है, एक भूमिका में कई संसाधन हो सकते हैं, और संसाधन में कई विशेषाधिकार हो सकते हैं। क्या मैं आपके समाधान में कुछ गलत समझ रहा हूं? – Sonny
सही के बारे में लगता है। जिस तरह से उपयोगकर्ता स्थापित होते हैं, प्रत्येक उपयोगकर्ता को इसके माता-पिता से विशेषाधिकार प्राप्त होते हैं।तो "व्यवस्थापक" सभी "अतिथि" और "सदस्यों" विशेषाधिकार प्राप्त करता है। व्यवस्थापक के तहत, मैं "सभी" की अनुमति देता हूं और फिर सभी संसाधनों पर "शुद्ध" कार्रवाई से इनकार करता हूं और केवल "सीएमएस: टिप्पणियां" संसाधन पर "निर्माण" क्रिया से इनकार करता हूं। इसलिए वे अभी भी "सीएमएस: टिप्पणियां-> देखें" या "सीएमएस: टिप्पणियां-> मध्यम" क्रियाओं तक पहुंच सकते हैं। – typeoneerror
कुछ कोड जोड़ा गया। – typeoneerror