Чуть ниже мы интегрировали 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(); } ...[/sourcecode] Пишем: [sourcecode language="php"] <?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 у меня в книжках лежит 😉
Зачетный пост, спасибо!
очень обидно, что предыдущий пост (про альтернативную интеграцию) не работает.
перерыл все, в т.ч. гугл-кеш, вебархив — нет ничего 😦
Всё хорошо, но научитесь лучше писать грамотно, заработаете большую лояльность пользователей.
ДобОвляем пишется через а, то есть добАвляем, от слова добавить. Проверяйте в ворде хотя бы.
Это сообщение можно удалить.
Только дураки повторяют свои ошибки, умные совершают новые.
Никакие рассуждения не в состоянии указать человеку путь, которого он не хочет видеть. (Ромен Ролан)
С больным ребенком надо обращаться как со взрослым, с больным взрослым — как с дитем.
Когда-то, я был умным и хотел изменить мир. Теперь, я стал мудрым и хочу изменить себя!
Спасибо. Нормальной (из коробки, как хотелось бы) авторизации в CI так и не нашёл… Подстраиваемся. 🙂
мелкие несоответствия не позволяют скопипастить и запустить
initialization_Acl() и init_roles(),
admin и administrator
А вообще — очень удобно. Ещё сложить бы это не в контроллер..
ps. понимаю, что задержался с комментарием года этак на два с половиной 🙂