2010-02-16 17 views
9

मैंने ज़ेन फ्रेमवर्क पर अपना आवेदन आधारित किया है। मैं प्रमाणीकरण के लिए Zend_Auth का उपयोग कर रहा हूं, लेकिन मुझे यकीन नहीं है कि Zend_Acl मेरे लिए काम करेगा क्योंकि, स्पष्ट रूप से, मैंने जो उदाहरण देखे हैं वे मेरी आवश्यकताओं के लिए बहुत सरल हैं या मुझे भ्रमित करते हैं।क्या ज़ेंड एसीएल मेरी ज़रूरतों को पूरा करता है?

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

  1. उपयोगकर्ता एक भूमिका
  2. एक भूमिका कई संसाधन हो सकता है
  3. संसाधन कई विशेषाधिकार

भूमिकाओं हो सकता है वास्तव में सिर्फ कोई पदानुक्रम के साथ संसाधन विशेषाधिकार का संग्रह कर रहे हैं। संसाधन का एक उदाहरण 'पृष्ठ' होगा। प्रत्येक व्यक्ति पेज देख सकता है, लेकिन एक प्रमाणित उपयोगकर्ता को पृष्ठों के साथ कुछ और करने के लिए 'एड', 'एडिट', या 'डिलीट' विशेषाधिकारों की आवश्यकता होगी।

क्या ज़ेंड एसीएल के साथ यह जाल है? क्या मैं एसीएल को इस तरह से सोच रहा हूं कि मेरे लिए समस्याएं पैदा हो रही हैं?


मेरे समाधान

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']); 
    } 
} 

उत्तर

10

यह ठीक है कि यह कैसे काम करता है और मुझे लगता है कि आप इसके बारे में सही तरीके से सोच रहे हैं। आप अपने संसाधन जोड़ सकते हैं और फिर कुछ उपयोगकर्ता भूमिकाओं तक पहुंचने के लिए विशेषाधिकार जोड़ सकते हैं। उदाहरण के लिए, मेरे सीएमएस में, मेरे पास "डेवलपर", "व्यवस्थापक" और "उपयोगकर्ता" हैं। नीचे दिए गए कोड में मैं सामान्य पहुंच जोड़ता हूं और फिर कुछ उपयोगकर्ता की पहुंच से कुछ क्रियाएं और विशिष्ट विधियों को हटा देता हूं। बेशक यह मेरे आवेदन के लिए बहुत विशिष्ट है लेकिन मूल रूप से, आपको उपयोगकर्ता की भूमिका-> getIdentity() (या इसी तरह) से प्राप्त करना होगा और फिर डेटाबेस से अपनी भूमिका/संसाधन जोड़ें।

<?php 

/** 
* @author  Benjamin Borowski <[email protected]> 
* @copyright Copyright (c) Typeoneerror Studios http://typeoneerror.com 
* @version $Id$ 
* @category Typeoneerror 
* @package Acl 
*/ 

/** 
* Defines basic roles and resources for an application as 
* well as a Content Management System (CMS). 
* 
* Zend_Acl provides a lightweight and flexible access control list 
* (ACL) implementation for privileges management. 
* 
* {@inheritdoc} 
* 
* @author  Benjamin Borowski <[email protected]> 
* @copyright Copyright (c) Typeoneerror Studios http://typeoneerror.com 
* @version $Id$ 
* @category Typeoneerror 
* @package Acl 
*/ 
class Typeoneerror_Acl extends Zend_Acl 
{ 
    /** 
    * Constructor function. 
    * 
    * Creates basic roles and resources and adds them to Acl. 
    * 
    * {@inheritdoc} 
    * 
    * @return Typeoneerror_Acl 
    */ 
    public function __construct() 
    { 
     //--------------------------------------- 
     // ROLES 
     //--------------------------------------- 

     $this->_addRole("guest") 
      ->_addRole("member", "guest") 
      ->_addRole("admin", "member") 
      ->_addRole("developer", "admin"); 

     //--------------------------------------- 
     // FRONT-END RESOURCES 
     //--------------------------------------- 

     $this->_add("default"); 

     //--------------------------------------- 
     // BACK-END RESOURCES 
     //--------------------------------------- 

     $this->_add("cms") 
      ->_add("cms:articles", "cms") 
      ->_add("cms:auth", "cms") 
      ->_add("cms:bug-report", "cms") 
      ->_add("cms:calendar", "cms") 
      ->_add("cms:categories", "cms") 
      ->_add("cms:comments", "cms") 
      ->_add("cms:error", "cms") 
      ->_add("cms:galleries", "cms") 
      ->_add("cms:pages", "cms") 
      ->_add("cms:photos", "cms") 
      ->_add("cms:tags", "cms") 
      ->_add("cms:users", "cms"); 

     //--------------------------------------- 
     // GUEST PERMISSIONS 
     //--------------------------------------- 

     $this->allow("guest", "default") 
      ->allow("guest", "cms:auth")   // -- guests can attempt to log-in 
      ->allow("guest", "cms:error")   // -- guests can break stuff 
      ->allow("guest", "cms:bug-report"); // -- guests can report bugs 

     //--------------------------------------- 
     // ADMIN PERMISSIONS 
     //--------------------------------------- 

     $this->allow("admin") 
      ->deny("admin", null, "purge")      // -- admins cannot purge (normally) 
      ->deny("admin", "cms:comments", "create");   // -- only devs can create a comment 

     //--------------------------------------- 
     // DEVELOPER PERMISSIONS 
     //--------------------------------------- 

     $this->allow("developer");    // -- unrestricted access 

     return $this; 
    } 

    /** 
    * Adds a Resource having an identifier unique to the ACL. 
    * 
    * @param Zend_Acl_Resource_Interface $resource  The resource to add 
    * @param Zend_Acl_Resource_Interface|string $parent A parent resource it inherits from 
    * @return Typeoneerror_Acl       Reference to Acl class 
    */ 
    protected function _add($resource, $parent = null) 
    { 
     $this->add(new Zend_Acl_Resource($resource), $parent); 

     return $this; 
    } 

    /** 
    * Wrapper for <code>addRole</code> 
    * 
    * @param Zend_Acl_Resource_Interface $resource  The resource to add 
    * @param Zend_Acl_Resource_Interface|string $parents Parent resources it inherits from 
    * @return Typeoneerror_Acl       Reference to Acl class 
    */ 
    protected function _addRole($role, $parents = null) 
    { 
     $this->addRole(new Zend_Acl_Role($role, $parents)); 

     return $this; 
    } 

} 

संपादित

लगता है कि मैं भी व्याख्या करनी चाहिए कि मैं एक Typeoneerror_Controller_Plugin_Acl जो जब भी किसी भी संसाधन अनुरोध किया जाता है प्रयोग किया जाता है है। यहां मैं "टैग" बना देता हूं कि अनुरोधित संसाधन बनाता है और जांचता है कि उपयोगकर्ता के पास उस टैग तक पहुंच है या नहीं:

$controller = $request->controller; 
    $action = $request->action; 
    $module = (empty($request->module)) ? "default" : $request->module; 

    // -- this ends up like "cms:articles" just like my resources 
    $resource = $module . ":" . $controller; 

    if (!$this->__acl->has($resource)) 
    { 
     $resource = $module; 
    } 

    // -- the good stuff. check if the user's role can access the resource and action 
    if (!$this->__acl->isAllowed($role, $resource, $action)) 
    { 
     //more code 
    } 
+0

मैं आपके उदाहरण में उपयोगकर्ता, भूमिका और संसाधन के स्तर देख रहा हूं। मेरे पास उपयोगकर्ता, भूमिका, संसाधन, विशेषाधिकार है। उपयोगकर्ता की एक भूमिका होती है, एक भूमिका में कई संसाधन हो सकते हैं, और संसाधन में कई विशेषाधिकार हो सकते हैं। क्या मैं आपके समाधान में कुछ गलत समझ रहा हूं? – Sonny

+0

सही के बारे में लगता है। जिस तरह से उपयोगकर्ता स्थापित होते हैं, प्रत्येक उपयोगकर्ता को इसके माता-पिता से विशेषाधिकार प्राप्त होते हैं।तो "व्यवस्थापक" सभी "अतिथि" और "सदस्यों" विशेषाधिकार प्राप्त करता है। व्यवस्थापक के तहत, मैं "सभी" की अनुमति देता हूं और फिर सभी संसाधनों पर "शुद्ध" कार्रवाई से इनकार करता हूं और केवल "सीएमएस: टिप्पणियां" संसाधन पर "निर्माण" क्रिया से इनकार करता हूं। इसलिए वे अभी भी "सीएमएस: टिप्पणियां-> देखें" या "सीएमएस: टिप्पणियां-> मध्यम" क्रियाओं तक पहुंच सकते हैं। – typeoneerror

+0

कुछ कोड जोड़ा गया। – typeoneerror

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