Чуть ниже мы интегрировали Zend Framework в Codeigniter а сейчас посмотрим как использовать Zend_Acl.
Итак для начала нужно сказать, что Zend_Acl очень гибкая система и позволяет практически полностью контролировать доступ пользователй в вашем приложении.
Достигается это введением ресурсов и привилегий, то есть можно например для группы пользователей “зарегистрированный пользователь” определить действия “чтение”,”создание” и “редактирование” для ресурса “статьи, а действия “публикация” и “удаление” для этого ресурса запретить.
В самом зенде обычно ресурсы это – контроллер, а действия это – action’ы этого контроллера, такую же систему я буду использовать в Codeigniter’е.
Итак допустим у нас есть контроллер profile.php котрый предназначен для зарегестрированных пользователей и отвечает за отображение редактирование и для администратора ещё и удаление пользовательского профиля :
< ?php
class Profile extends Controller {
function Profile()
{
parent::Controller();
}
function index()
{
// отображение пользовательского профиля
}
function modify()
{
// редактирование пользовательского профиля
}
function delete()
{
// удаление пользовательского порфиля
}
}
?>
И допустим и вас на сайте должно быть 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";
Вот в принципе и всё. Довольно сумбурно получилось но, надеюсь понятно ![]()
P.S. Для дополнительной документации по Zend_Acl смотрите документацию zend framework.
Спасибо за долгожданный материал – читаю…
Не за что
в принципе писал по быстрому, но надеюсь, что всё понятно
Вполне ясно, но всё же с использованием Zend_Auth было бы полнее статья и… намного полезней – про этот компонент не думаешь написать?
To Acid
Насчёт полезней не знаю, типа копи&пейст и имеем систему для сайта?
хотя полнее это да. Ну а вообще, Москва не сразу строилась. Всё будет, но позже
Ну да – идеальная статья это когда прочитал, всё понял, скопипастил код и всё заработало – что ещё надо то? ) Теория вся есть и в мане, а статьи как правило и ценятся практическим именно применением
В общем ждём
во народ
даёшь расклад по ACL а тебе говорят – “нам бы ещё как пользователей в базе хранить и логин форму что бы проверяла и если да, то в сессию бы писала и печенюх давала”
а если серьёзно просто не было времени полный туториал замутить
спасибо и на этом
познавательно, буду пробовать… я вообще твой блог теперь как “сказку на ночь” и “пособие по утренней зарядке” читаю
)))
To Tyler:
“Пособие по утренней зарядке” – должно быть прелюбопнейшим чтивом
дай почитать??
mihailt, это я так, вшутку, но если серьезно то http://www.tyler.org.ua/category/samorazvitie/ посты с темой “жаворонок” там и линки есть на блого-товарищей которые грамотно все преимущества и недостатки сего “пособия” рассказывают.
в программерской практике – вполне полезная привычка, imho
Кстати плохо что от тебя не приходят уведомления о комментариях, или я что то не так сделал?
To Tyler:
Насчёт жаворонков – я в принципе вобще мало сплю часов 5-6 не больше, отсыпаюсь обычно на выходных.
Об уведомлениях – очень жаль, но worpress.com не предлагает уведомления о коментариях читателям, может в будущем, но пока нет
пару дней назад где то находил где толково объяснялось как можно наследовать класс Controller чтобы в нем доопределить возможности аутентификации и контроля доступа. Потом наследуя все свои контроллеры от этого класса – не нужно заботится о проверке доступа в каждом контроллере.
Вот только проблема – тогда отложил статейку, а ща вот почитать… и не нашел, может подскажешь подобные ресурсы или в какую сторону копать?
Я конечно понимаю что ты и так тут подробно довольно описал, но все же…
To Tyler:
у тебя с инглишом как? если ок, скачай книжку по CI у меня в книжках лежит