Использование 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();
    }
...

Пишем:


<?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.

14 Ответы в “Использование 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 пп

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

  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 у меня в книжках лежит ;)


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

Ответить