Листинг 2.2 Подключаемый модуль CustomControllerAclManager, проверяющий допуски перед отправкой запроса на обработку
(файл CustomControllerAclManager.php) <?php class CustomControllerAclManager extends Zend_Controller_Plugin_Abstract { // роль по умолчанию, если не вошел (или роль не определена) private $_defaultRole = 'guest'; // выполнить операцию, если у пользователя не хватает привилегий private $_authController = array('controller' => 'account', 'action' => 'login'); public function __construct(Zend_Auth $auth) { $this->auth = $auth; $this->acl = new Zend_Acl(); // добаляем новые роли $this->acl->addRole(new Zend_Acl_Role($this->_defaultRole)); $this->acl->addRole(new Zend_Acl_Role('member')); $this->acl->addRole(new Zend_Acl_Role('administrator'), 'member'); // добавляем контролируемые ресурсы $this->acl->add(new Zend_Acl_Resource('account')); $this->acl->add(new Zend_Acl_Resource('admin')); // по умолчанию даем всемпользователям доступ ко всему // кроме управления учетными записями и администрированием $this->acl->allow(); $this->acl->deny(null, 'account'); $this->acl->deny(null, 'admin'); // добавляем исключение. чтобы гости могли войти или // зарегистрироваться, если нет привилегий $this->acl->allow('guest', 'account', array('login', 'fetchpassword', 'register', 'registercomplete')); // позволяем зарегистрированным пользователям доступ к управлению учетными записями $this->acl->allow('member', 'account'); // даем администраторам доступ в область администрирования $this->acl->allow('administrator', 'admin'); } /** * preDispatch * * Прежде, чем отправлять запрос на обработку, проверяет есть ли у пользователя * нужные привелегии. Если нет, инициирует операцию по умолчанию * * * @param Zend_Controller_Request_Abstract $request */ public function preDispatch(Zend_Controller_Request_Abstract $request) { // проверка, вошел ли пользователь и имеет ли нужную роль // если нет, то назначается роль по умолчанию (гость) if ($this->auth->hasIdentity()) $role = $this->auth->getIdentity()->user_type; else $role = $this->_defaultRole; if (!$this->acl->hasRole($role)) $role = $this->_defaultRole; // контролируемый ресурс - имя запрашиваемого контроллера $resource = $request->controller; // привилегия - имя запрашиваемой операции $privilege = $request->action; // если ресурс не определен явно. проверить // глобальные допуски по умолчанию if (!$this->acl->has($resource)) $resource = null; // в допуске отказано. Выполняется операция по умолчанию if (!$this->acl->isAllowed($role, $resource, $privilege)) { $request->setControllerName($this->_authController['controller']); $request->setActionName($this->_authController['action']); } } } ?> Листинг 2.3 Первоначальная версия класса DatabaseObject _ User (файл user.php) <? class DatabaseObject_User extends DatabaseObject { static $userTypes = array('member' => 'Member', 'administrator' => 'Administrator'); public $profile = null; public $_newPassword = null; public function __construct($db) { parent::__construct($db, 'users', 'user_id'); $this->add('username'); $this->add('password'); $this->add('user_type', 'member'); $this->add('ts_created', time(), self::TYPE_TIMESTAMP); $this->add('ts_last_login', null, self::TYPE_TIMESTAMP); } } ?> Листинг 2.4 Полный текст класса FormProcessor_UserRegistration (файл UserRegistration.php) <?php class FormProcessor_UserRegistration extends FormProcessor { protected $db = null; public $user = null; public function __construct($db) { parent::__construct(); $this->db = $db; $this->user = new DatabaseObject_User($db); $this->user->type = 'member'; } public function process(Zend_Controller_Request_Abstract $request) { // проверка правильности имени $this->username = trim($request->getPost('username')); if (strlen($this->username) == 0) $this->addError('username', 'Please enter a username'); else if (!DatabaseObject_User::IsValidUsername($this->username)) $this->addError('username', 'Please enter a valid username'); else if ($this->user->usernameExists($this->username)) $this->addError('username', 'The selected username already exists'); else $this->user->username = $this->username; // проверка имени и фамилии $this->first_name = $this->sanitize($request->getPost('first_name')); if (strlen($this->first_name) == 0) $this->addError('first_name', 'Please enter your first name'); else $this->user->profile->first_name = $this->first_name; $this->last_name = $this->sanitize($request->getPost('last_name')); if (strlen($this->last_name) == 0) $this->addError('last_name', 'Please enter your last name'); else $this->user->profile->last_name = $this->last_name; // проверка адреса электронной почты $this->email = $this->sanitize($request->getPost('email')); $validator = new Zend_Validate_EmailAddress(); if (strlen($this->email) == 0) $this->addError('email', 'Please enter your e-mail address'); else if (!$validator->isValid($this->email)) $this->addError('email', 'Please enter a valid e-mail address'); else $this->user->profile->email = $this->email; $session = new Zend_Session_Namespace('captcha'); $this->captcha = $this->sanitize($request->getPost('captcha')); if ($this->captcha != $session->phrase) $this->addError('captcha', 'Please enter the correct phrase'); // если ошибок нет, сохранить данные пользоваетля if (!$this->hasError()) { $this->user->save(); unset($session->phrase); } // возврат true, если нет ошибок return !$this->hasError(); } }
Популярное: Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (176)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |