Zend ACL benim ihtiyaçlarına uygun mu?

1 Cevap php

Ben Zend Framework üzerine benim tabanlı uygulama var. Ben kimlik doğrulaması için Zend_Auth kullanıyorum, ama açıkçası, ben gördüğüm örnekler ya benim ihtiyaçları için çok basit ya da karıştırmayın, çünkü Zend_Acl Benim için çalışacaktır eğer emin değilim ben.

Ben Kaynakları olarak benim uygulamada elementlerin düşünüyordum ve bu Kaynakları Ayrıcalıklar sahip olabilir. Kaynak Ayrıcalıklar içeren roller dinamik olarak tanımlanan kullanıcılara atanır. Ben normalize tablolarda bu bilgileri saklamak ediyorum.

  1. Kullanıcılar Rolü var
  2. Bir Rol birden Kaynakları olabilir
  3. Kaynakları birden Ayrıcalıkları olabilir

Roller gerçekten hiçbir hiyerarşi ile Kaynak Ayrıcalıklar sadece koleksiyonları. Bir Kaynak bir örnek 'Sayfa' olacaktır. Herkes sayfalarını görüntüleyebilir, ancak kimliği doğrulanmış bir kullanıcı, 'ekle', 'edit' gerek, ya da sayfaları başka bir şey yapmak için ayrıcalık 'sil' olacaktır.

Bu Zend ACL ile örgü mu? Benim için sorun yaratmak için gidiyor bir şekilde ACL düşünüyor muyum?


My Solution

Typeonerror kredi alır, ama burada benim özel çözüm bulunuyor.

Ben sadece geçerli kullanıcı rolünü yüklemek için Zend_Acl, benim kullanımı kolaylaştırmak için genişletilmiş:

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

I resource, privilege döndüren bir sorgu çalıştırmak ACL doldurmak, ve role_id sütunlar için. role_id sütun kullanıcının rolü bu ayrıcalığa sahip değilse set sonuç sıfırdır.

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

1 Cevap

Yani tam olarak nasıl çalıştığını ve ben doğru bir şekilde düşünmeye düşünüyorum. Eğer kaynak eklemek ve daha sonra belirli bir kullanıcı rolleri onlara erişmek için izin ayrıcalıkları ekleyebilirsiniz. Örneğin, benim CMS, ben "geliştiriciler", "adminler" ve "kullanıcılar" var. Aşağıdaki kodda Ben genel erişim eklemek ve daha sonra belirli kullanıcının erişimine bazı eylemleri ve belirli yöntemleri çıkarmak. Tabii ki bu benim uygulama için oldukça özel ancak temelde, yetki-> GetIdentity () (veya benzeri), kullanıcının rolü almak ve daha sonra veritabanından rolleri / kaynakları eklemek gerekiyor.

<?php

/**
 * @author     Benjamin Borowski <ben.borowski@typeoneerror.com>
 * @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 <ben.borowski@typeoneerror.com>
 * @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;
    }

}

Edit

Ben de bir Typeoneerror_Controller_Plugin_Acl herhangi bir kaynak istenen her kullanıldığı sahip olduğunu açıklamak gerekir sanırım. Burada istenen kaynak yapar "etiketi" oluşturmak ve kullanıcı bu etiketi erişimi olup olmadığını kontrol edin:

    $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 
    }