Pull to refresh

Zend_Auth + Zend_Acl

Reading time3 min
Views2.9K
На днях засел за изучение Zend Framework. Решил сразу написать простенькую cms. Первым делом решил разобраться с аутентификацией и авторизацией.


собственно помучиться пришлось, но своего я добился. и теперь решил поделится своими мучениями с хабраюзерами.

Шаг 1. необходимо создать класс с наследованием от Zend_Controller_Action:

class Controller extends Zend_Controller_Action
{
public function preDispatch()
{
//тут мы потом будем писать код
}
}


Теперь во всех контроллерах необходимо наследовать от только что созданного нами класса. Все что в функции preDispatch() будет обрабатываться раньше, чем контроллер, что нам и нужно.

Шаг 2. Собственно аутентификация. Не стал ничего выдумывать и взял из этого хабратопика

Шаг 3. Начнем работу с функцией preDispatch().

Во-первых, нам необходимо знать, что за юзер находится на сайте. Для этого читаем сессии:

class Controller extends Zend_Controller_Action
{
public function preDispatch()
{
$this->user = $this->getUser();

}

public function getUser() {
Zend_Session::start();
$namespace = new Zend_Session_Namespace('Zend_Auth');
if($namespace->storage) {
$user['id'] = $namespace->storage->id;
$user['username'] = $namespace->storage->username;
$user['name'] = $namespace->storage->name;
//к какой группе относится юзер. понадобится для разделения прав доступа
$user['group'] = $namespace->storage->group;
return $user;
}
else {
// если не залогинен, возвращаем учетную запись гостя
return array('id' => '0','username' => 'Guest','name' => 'Гость','group' => 'guest');
}
}
}


Итак, этап аутентификации пользователя пройден, приступаем к авторизации. Не буду приводить основы Zend_Acl, в принципе все итак понятно из кода:

$acl = new Zend_Acl();

//добавление ролей, т.е. групп пользователей
$acl->addRole(new Zend_Acl_Role('guest'))
->addRole(new Zend_Acl_Role('user'))
->addRole(new Zend_Acl_Role('admin'));

//добавление ресурсов, к которым запрашивают доступ пользователи
$acl->add(new Zend_Acl_Resource('index'));
$acl->add(new Zend_Acl_Resource('articles'));
$acl->add(new Zend_Acl_Resource('user'));
$acl->add(new Zend_Acl_Resource('auth'));
$acl->add(new Zend_Acl_Resource('error'));
$acl->add(new Zend_Acl_Resource('registration'));

//собственно ограничение на доступ (последний аргумент - Action контроллера) null = все
$acl->deny('guest', 'user', null);
//разрешаем всем все остальное
$acl->allow(null, null, null);

//проверка на доступ
if(!$acl->isAllowed($this->user['group'], $this->getRequest()->getControllerName(),$this->getRequest()->getActionName())) {
//если доступа нет, отсылаем на страницу ошибки
$this->_redirect('/error/error/');
}


Вот, собственно и все. В конце приведу целиком код контроллера с preDispatch():

class Controller extends Zend_Controller_Action
{
public function preDispatch()
{
$this->user = $this->getUser();

$acl = new Zend_Acl();

$acl->addRole(new Zend_Acl_Role('guest'))
->addRole(new Zend_Acl_Role('user'))
->addRole(new Zend_Acl_Role('admin'));

$acl->add(new Zend_Acl_Resource('index'));
$acl->add(new Zend_Acl_Resource('articles'));
$acl->add(new Zend_Acl_Resource('user'));
$acl->add(new Zend_Acl_Resource('auth'));
$acl->add(new Zend_Acl_Resource('error'));
$acl->add(new Zend_Acl_Resource('registration'));

$acl->deny('guest', 'user', null);
$acl->allow(null, null, null);

$request = $this->getRequest();
if(!$acl->isAllowed($this->user['group'], $this->getRequest()->getControllerName(), $this->getRequest()->getActionName())) {
$this->_redirect('/error/error/');
}
}

public function getUser() {
Zend_Session::start();
$namespace = new Zend_Session_Namespace('Zend_Auth');

if($namespace->storage) {
$user['id'] = $namespace->storage->id;
$user['username'] = $namespace->storage->username;
$user['name'] = $namespace->storage->name;
$user['group'] = $namespace->storage->group;

return $user;
}
else {
return array('id' => '0','username' => 'Guest','name' => 'Гость','group' => 'guest');
}
}
}



Спасибо всем, кто дотерпел до конца. Надеюсь, что кому-то это поможет.
Tags:
Hubs:
Total votes 39: ↑22.5 and ↓16.5+6
Comments37

Articles