Подходит ли Zend ACL для моих нужд?

Я основал свое приложение на Zend Framework. я используюZend_Auth для аутентификации, но я не уверен, еслиZend_Acl будет работать для меня, потому что, честно говоря, примеры, которые я видел, либо слишком упрощены для моих нужд, либо смущают меня.

Я думаю об элементах в моем приложении как о ресурсах, и эти ресурсы могут иметь привилегии. Роли, содержащие права доступа к ресурсам, динамически определяются для пользователей. Я храню эту информацию в нормализованных таблицах.

У пользователей есть рольРоль может иметь несколько ресурсовРесурсы могут иметь несколько привилегий

Роли - это на самом деле просто коллекции Ресурсных Привилегий без иерархии. Примером Ресурса будет «Страница». Каждый может просматривать страницы, но аутентифицированному пользователю потребуются привилегии «добавить», «изменить» или «удалить», чтобы сделать что-либо еще со страницами.

Совпадает ли это с Zend ACL? Думаю ли я, что ACL создаст для меня проблемы?

Мое решение

Типонеррор получает кредит, но вот мое конкретное решение.

Я продлил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);
    }
}

Для заполнения ACL я выполняю запрос, который возвращает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']);
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос