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

Итак для начала нужно сказать, что 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/

CodeIgniter: Загрузка фотографий и автоматическое масштабирование изображения

Скажу сразу — решение не самое удачно, но рабочее :)

 $folder = './user_images/photos/tmp';
 $folder_dest = './user_images/photos';
 $config['upload_path'] = $folder;
 $config['allowed_types'] = 'gif|jpg|png';
 $this->load->library('upload', $config);
 if ( ! $this->upload->do_upload('user_avatar'))
 {
 $answer['error_set'] = TRUE;
 $answer['error'] = 'Ошибка обновления фотографии';
 }
 else
 {
 $upload_data = $this->upload->data();
 $config['image_library'] = 'gd2';
 $config['source_image'] = $folder.'/'.$upload_data['file_name'];
 $config['create_thumb'] = TRUE;
 $config['maintain_ratio'] = TRUE;
 $config['width'] = 287;
 $config['height'] = 353;
 $this->load->library('image_lib', $config);
 $this->image_lib->resize();
 copy($folder.'/'.$upload_data['file_name'],$folder_dest.'/'.$this->session->userdata('user_name').$upload_data['file_ext']);
 unlink ($config['upload_path'].'/'.$upload_data['file_name']);
 $answer['notice'] = TRUE;
 $answer['txt_notice'] = 'Фотография сохранена';
 }