Итак для начала нужно сказать, что Zend_Acl очень гибкая система и позволяет практически полностью контролировать доступ пользователй в вашем приложении.
Достигается это введением ресурсов и привилегий, то есть можно например для группы пользователей «зарегистрированный пользователь» определить действия «чтение»,»создание» и «редактирование» для ресурса «статьи, а действия «публикация» и «удаление» для этого ресурса запретить.
В самом зенде обычно ресурсы это – контроллер, а действия это – action’ы этого контроллера, такую же систему я буду использовать в Codeigniter’е.
Итак допустим у нас есть контроллер profile.php котрый предназначен для зарегестрированных пользователей и отвечает за отображение редактирование и для администратора ещё и удаление пользовательского профиля :
<pre>< ?php
class Profile extends Controller {
function Profile()
{
parent::Controller();
}
function index()
{
// отображение пользовательского профиля
}
function modify()
{
// редактирование пользовательского профиля
}
function delete()
{
// удаление пользовательского порфиля
}
}
?></pre>
И допустим и вас на сайте должно быть 3 группы пользователей – «admin»,»member» и «guest».Для начала нам нужно создать схему контроля доступа – создаём хелпер (zend_acl_helper.php) :
< ?php
function initialization_Acl() {
//Подклучаем зендовский загрузчик
require_once "Zend/Loader.php";
//Загружаем необходимые нам библиотеки ( контроль доступа, роли, ресурсы )
Zend_Loader::loadClass('Zend_Acl');
Zend_Loader::loadClass('Zend_Acl_Role');
Zend_Loader::loadClass('Zend_Acl_Resource');
//Создаём новый объект контроля доступа
$acl = new Zend_Acl();
// определяем роли
$acl->addRole(new Zend_Acl_Role('guest'));
$acl->addRole(new Zend_Acl_Role('member'));
$acl->addRole(new Zend_Acl_Role('administrator'));
//определяем ресурс
$acl->add(new Zend_Acl_Resource('profile'));
// запрещяем какие либо действия с profile для guest'а и member'а
$acl->deny('guest','profile');
$acl->deny('member','profile');
// даем полный доступ admin'у для ресурса profile
$acl->allow('admin' , 'profile');
// разрешаем member'у доступ для ресурса profile на действия index и modify
$acl->allow('member' , 'profile' , array('index','modify'));
return $acl;
}
?>
И добовляем этот хелпер в autoload.php В данном случае, как впрочем и почти во всех, я использую действие index для определения действия просмотра.Итак роли и ресурсы и определенны теперь остаётся только задать их в самом контроллере.
Добовляем переменные и изменяем конструктор нашего Profile контроллера следующим образом :
вместо:
< ?php
class Profile extends Controller {
function Profile()
{
parent::Controller();
}
...
Пишем:
<?php
class Profile extends Controller {
private $resource = null;
private $priviledge = null;
// роль которая используется если роль пользователья не определена
private $default_role = 'guest'
function Profile()
{
parent::Controller();
// Получаем наш объект из хелпера
$acl = init_roles();
// обращаемся по ссылке к роутеру для последующего доступа к методам
$router =& load_class('Router');
// при помощи методов роутера определяем ресурс и action и устанавливаем их в переменные
$this->resource = $router->fetch_class();
$this->priviledge = $router->fetch_method();
// здесь получаем инфу о пользователе и устанавливем её в $default_role
}
О установке пользователя не писал специально так как, сейчас мы говорим о контроле доступа, а не о идентификации пользователя вобщем в не зависимости от того как вы храните инфу о текщем пользователе надо передать значение переменной default_role .Теперь у нас всё готово и остаётся только осуществить проверку пользователя – там же, в конструкторе для поверки пишем:
echo $acl->isAllowed($this->default_role, $this->resource, $this->priviledge) ? "allowed" : "denied";
Вот в принципе и всё.
http://mihailt.wordpress.com/2008/02/11/%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-zend_acl-%D0%B4%D0%BB%D1%8F-%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8F-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0/
