Использование Zend_Acl для контроля доступа в Codeigniter’e

Чуть ниже мы интегрировали 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();
    }
...&#91;/sourcecode&#93;

Пишем:

&#91;sourcecode language="php"&#93;
<?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.

23 Ответы to “Использование Zend_Acl для контроля доступа в Codeigniter’e”


  1. 1 ACID Jesus 12 февраля, 2008 в 7:44 дп

    Спасибо за долгожданный материал — читаю…

  2. 2 mihailt 12 февраля, 2008 в 8:41 дп

    Не за что 🙂 в принципе писал по быстрому, но надеюсь, что всё понятно 😉

  3. 3 ACID Jesus 12 февраля, 2008 в 6:57 пп

    Вполне ясно, но всё же с использованием Zend_Auth было бы полнее статья и… намного полезней — про этот компонент не думаешь написать? 😉

  4. 4 mihailt 12 февраля, 2008 в 7:05 пп

    To Acid
    Насчёт полезней не знаю, типа копи&пейст и имеем систему для сайта?
    хотя полнее это да. Ну а вообще, Москва не сразу строилась. Всё будет, но позже 😉

  5. 5 ACID Jesus 13 февраля, 2008 в 12:42 пп

    Ну да — идеальная статья это когда прочитал, всё понял, скопипастил код и всё заработало — что ещё надо то? ) Теория вся есть и в мане, а статьи как правило и ценятся практическим именно применением 😎 В общем ждём 😉

  6. 6 mihailt 13 февраля, 2008 в 1:24 пп

    во народ 🙂 даёшь расклад по ACL а тебе говорят — «нам бы ещё как пользователей в базе хранить и логин форму что бы проверяла и если да, то в сессию бы писала и печенюх давала» 😉

    а если серьёзно просто не было времени полный туториал замутить 🙂

  7. 7 Tyler 21 февраля, 2008 в 5:45 пп

    спасибо и на этом 🙂 познавательно, буду пробовать… я вообще твой блог теперь как «сказку на ночь» и «пособие по утренней зарядке» читаю :))))

  8. 8 mihailt 21 февраля, 2008 в 6:25 пп

    To Tyler:

    “Пособие по утренней зарядке” — должно быть прелюбопнейшим чтивом 😉 дай почитать?? 🙂 🙂

  9. 9 Tyler 25 февраля, 2008 в 5:31 пп

    mihailt, это я так, вшутку, но если серьезно то http://www.tyler.org.ua/category/samorazvitie/ посты с темой «жаворонок» там и линки есть на блого-товарищей которые грамотно все преимущества и недостатки сего «пособия» рассказывают.
    в программерской практике — вполне полезная привычка, imho

  10. 10 Tyler 25 февраля, 2008 в 5:32 пп

    Кстати плохо что от тебя не приходят уведомления о комментариях, или я что то не так сделал? 🙂

  11. 11 mihailt 25 февраля, 2008 в 6:27 пп

    To Tyler:

    Насчёт жаворонков — я в принципе вобще мало сплю часов 5-6 не больше, отсыпаюсь обычно на выходных. 😉

    Об уведомлениях — очень жаль, но worpress.com не предлагает уведомления о коментариях читателям, может в будущем, но пока нет 😦

  12. 12 Tyler 26 февраля, 2008 в 12:26 дп

    пару дней назад где то находил где толково объяснялось как можно наследовать класс Controller чтобы в нем доопределить возможности аутентификации и контроля доступа. Потом наследуя все свои контроллеры от этого класса — не нужно заботится о проверке доступа в каждом контроллере.
    Вот только проблема — тогда отложил статейку, а ща вот почитать… и не нашел, может подскажешь подобные ресурсы или в какую сторону копать?
    Я конечно понимаю что ты и так тут подробно довольно описал, но все же… 🙂

  13. 13 mihailt 28 февраля, 2008 в 9:43 дп

    To Tyler:
    у тебя с инглишом как? если ок, скачай книжку по CI у меня в книжках лежит 😉

  14. 14 engecdonOpeme 17 июля, 2009 в 8:14 дп

    Зачетный пост, спасибо!

  15. 15 molodoy 3 августа, 2009 в 10:33 дп

    очень обидно, что предыдущий пост (про альтернативную интеграцию) не работает.
    перерыл все, в т.ч. гугл-кеш, вебархив — нет ничего 😦

  16. 16 Алексей 27 ноября, 2009 в 11:41 дп

    Всё хорошо, но научитесь лучше писать грамотно, заработаете большую лояльность пользователей.
    ДобОвляем пишется через а, то есть добАвляем, от слова добавить. Проверяйте в ворде хотя бы.
    Это сообщение можно удалить.

  17. 17 suesCoisown 23 февраля, 2010 в 6:22 пп

    Только дураки повторяют свои ошибки, умные совершают новые.

  18. 18 dambedgelay 26 февраля, 2010 в 8:13 пп

    Никакие рассуждения не в состоянии указать человеку путь, которого он не хочет видеть. (Ромен Ролан)

  19. 19 Bugepinge 3 марта, 2010 в 2:02 дп

    С больным ребенком надо обращаться как со взрослым, с больным взрослым — как с дитем.

  20. 20 Kipsopicief 8 марта, 2010 в 3:01 дп

    Когда-то, я был умным и хотел изменить мир. Теперь, я стал мудрым и хочу изменить себя!

  21. 21 Levik 26 ноября, 2010 в 2:01 дп

    Спасибо. Нормальной (из коробки, как хотелось бы) авторизации в CI так и не нашёл… Подстраиваемся. 🙂

  22. 22 Levik 27 ноября, 2010 в 12:08 пп

    мелкие несоответствия не позволяют скопипастить и запустить
    initialization_Acl() и init_roles(),
    admin и administrator
    А вообще — очень удобно. Ещё сложить бы это не в контроллер..
    ps. понимаю, что задержался с комментарием года этак на два с половиной 🙂


  1. 1 Авторизация посетителей и ограничение доступа (CodeIgniter) Обратная ссылка на 14 февраля, 2008 в 5:24 пп
Comments are currently closed.



Читаем RSS