CakePHP. Разделение доступа без компонента ACL.

    В данный момент я пишу систему на связке CakePHP и MS SQL. Сначала попробовал использовать стандартный компонент ACL, но выяснилось, что CakePHP не полностью поддерживает MS SQL (по крайней мере в этом компоненте). Поэтому пришлось придумать следующий метод разделения доступа.

    Предполагается, что у нас существует модель User, описывающая пользователя, и в ней присутствует поле is_admin, определяющая его принадлежность к группе администраторов. Таким образом существуют три группы: гости, пользователи и администраторы.
    Для реализации подхода, нужно добавить код в app_controller.php

    <?php
    class AppController extends Controller
    {
    function beforeFilter()
    {
    $allowedToUsers = isset($this->allowedToUsers)? $this->allowedToUsers: array();
    $allowedToGuests = isset($this->allowedToGuests)? $this->allowedToGuests: array();

    $group = $this->userGroup();

    switch ($group)
    {
    case 'user':
    if(!in_array($this->action, $allowedToUsers))
    {
    $this->redirect('/pages/norights');
    }
    break;
    case 'guest':
    if(!in_array($this->action, $allowedToGuests))
    {
    $this->redirect('/users/login');
    }
    break;
    }
    }
    function userGroup()
    {
    $user = $this->Session->read('User');
    $ret = '';
    if(empty($user['name']))
    {
    $ret = 'guest';
    }
    else if(intval($user['is_admin']) == 1)
    {
    $ret = 'admin';
    }
    else
    {
    $ret = 'user';
    }
    return $ret;
    }

    }
    ?>

    Осталось установить ограничения в контроллерах приложения. Для этого нужно добавить массивы $allowedToUsers и $allowedToGuests, содержащие в себе список действий контроллера, к которым разрешен доступ соответствующим группам (предполагается, что администраторам разрешено все).
    class StudentsController extends AppController {

    var $name = 'Students';
    var $helpers = array('Html', 'Form', 'Time');

    var $allowedToUsers = array('index', 'view', 'add', 'edit', 'delete');
    var $allowedToGuests = array();

    Готово.

    Комментарии 6

      0
      Не пойму за что вас заминусовали. Держите плюс.
        0
        спасибо. а минусы так и остались для меня загадкой.
        0
        а не мог бы более целосно выложить сорс?
        или архивчиком с кратким самплом? :)

        очень интересная реализация ;)
          0
          не хватает такого куска кода
          <?php class AppController extends Controller { function beforeFilter() { $allowedToUsers = isset($this->
            0
            И скорее всего это для версии 1.1
            В версии 1.2 завести не удалось
              +1
              это писалось для версии 1.2, только еще до беты, по-моему.

              исходники вот

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое