Pull to refresh

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

Reading time2 min
Views697
В данный момент я пишу систему на связке 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();

Готово.
Tags:
Hubs:
Total votes 6: ↑2 and ↓4-2
Comments6

Articles