Подходит ли 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']);
}
}