Пользователь
0,0
рейтинг
24 июля 2007 в 17:04

Разработка → Введение в Zend_Auth перевод

PHP*
В статье приведен обзор возможностей компоненты Zend_Auth, дающий общее представление о реализации пользовательской авторизации в приложениях на базе Zend Framework. В качестве основы приводимых примеров, использованы материалы статьи «Введение в Zend Framework». Примеры протестированы на Zend Framework версий 0.9, 0.9.1 и 0.9.2, и скорее всего будут работать с более поздними версиями, но не с более ранними.

Автор: Роб Ален, http://akrabat.com
Оригинал: http://akrabat.com/zend-auth-tutorial
Перевод: Александр Мусаев, http://paradigm.ru

PDF-версия для печати: http://archive.paradigm.ru/zend_auth.pdf

Перед тем как начать

Реализация механизма аутентификации пользователей, который мы будем использовать в наших примерах, основана на PHP-сессиях. Убедитесь, что в качестве параметра session.save_path в вашем php.ini задана директория, доступная веб-серверу для записи.

Аутентификация

Аутентификацией или подтверждением подлинности называется процедура проверки соответствия субъекта и того, за кого он пытается себя выдать, с помощью некой уникальной информации. Данную процедуру следует отличать от идентификации (опознавания субъекта информационного взаимодействия) и авторизации (проверки прав доступа к ресурсам системы).

В контексте веб-приложений, под аутентификацией обычно подразумевается проверка соответствия пользователя его учетной записи на веб-сервере с помощью имени («логина») и пароля. В качестве примера реализации подобного механизма на базе Zend Framework, мы дополним подобной проверкой базу компакт-дисков (веб-приложение, реализованное в статье «Введение в Zend Framework»).

Для этого нам понадобится:
  1. создать в базе данных таблицу для пользователей (и добавить в нее новую учетную запись);
  2. создать форму входа в систему;
  3. реализовать контроллер, содержащий действия для входа и выхода;
  4. добавить в общий фрагмент шаблонов страниц возможность выхода из системы;
  5. добавить проверку того, что пользователь вошел в систему, прежде чем позволять ему выполнять любые действия.

Таблица users

Первое, что нам понадобится — таблица в базе данных для хранения учетных записей пользователей. Ее схема будет выглядеть следующим образом:

Поле Тип Null? Опции поля
id Integer No Primary key, Autoincrement
username Varchar(50) No Unique key
password Varchar(50) No
real_name Varchar(100) No -


При использовании MySQL, такую таблицу можно будет создать следующим запросом:
CREATE TABLE users (
    id INT(11) NOT NULL AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL,
    real_name VARCHAR(100) NOT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY username (username)
)

Нам понадобится добавить в нее учетную запись тестового пользователя:
INSERT INTO users (id, username, password, real_name)
    VALUES (1, 'rob', 'rob', 'Rob Allen');

Запустите данные SQL-запросы с помощью любой клиентской программы для MySQL. Имя пользователя и пароль при желании можно сменить на любые другие значения.

Файл начальной загрузки

Чтобы иметь возможность отслеживать регистрацию пользователей в системе (вход и выход), нам понадобится использовать механизм PHP-сессий. Для удобной работы с ним в Zend Framework предусмотрен специальный класс Zend_Session_Namespace.

Нам понадобится внести следующие изменения в файл начальной загрузки:

zf-tutorial/index.php:
...
Zend_Loader::loadClass('Zend_Db_Table');
Zend_Loader::loadClass('Zend_Debug');
Zend_Loader::loadClass('Zend_Auth');
// load configuration
...
// setup database
$dbAdapter = Zend_Db::factory($config->db->adapter,
    $config->db->config->asArray());
Zend_Db_Table::setDefaultAdapter($dbAdapter);
Zend_Registry::set('dbAdapter', $dbAdapter);
// setup controller
$frontController = Zend_Controller_Front::getInstance();
...

Все, что необходимо здесь выполнить, — убедиться в том, что класс Zend_Auth подключен, и адаптер базы данных dbAdapter зарегистрирован. Этот адаптер будет храниться в реестре, т. к. позже понадобится иметь к нему доступ из контроллера авторизации.

Контроллер авторизации

Для того, чтобы сгруппировать действия входа и выхода, нам понадобится специальный контроллер. Логично будет задать ему имя AuthController. Начнем его реализацию с конструктора и определения действия по-умолчанию (indexAction()):

zf-tutorial/application/controllers/AuthController.php:
<?php
class AuthController extends Zend_Controller_Action
{
    function init()
    {
        $this->initView();
        $this->view->baseUrl = $this->_request->getBaseUrl();
    }
    function indexAction()
    {
        $this->_redirect('/');
    }
}

В конструкторе класса-контроллера инициализируется вид и присваивается значение переменной baseUrl. Помимо конструктора, в классе определено действие indexAction(), что является обязательным требованием ко всем наследникам Zend_Controller_Action. Учитывая, что мы собираемся использовать только loginAction() и logoutAction(), действие по умолчанию нам не потребуется, поэтому мы будем перенаправлять пользователя с соответствующего этому действию URL на главную страницу сайта.

Вход

Для того, чтобы войти в систему, нужна специальная форма. Действие login контроллера AuthController будет взаимодействовать с ней точно так же, как действия IndexController работают со своими формами. Шаблон формы располагается в файле views/scripts/auth/login.phtml, а данные из нее будут обрабатываться методом AuthController::loginAction().

Форма входа в систему достаточно проста и содержит всего два поля — для имени пользователя и его пароля.

zf-tutorial/application/views/scripts/auth/login.phtml:
<?php echo $this->render('header.phtml'); ?>
<h1><?php echo $this->escape($this->title); ?></h1>
<?php if(!empty($this->message)) :?>
<div id="message">
<?php echo $this->escape($this->message);?>
</div>
<?php endif; ?>
<form action="<?php echo $this->baseUrl ?>/auth/login" method="post">
<div>
    <label for="username">Username</label>
    <input type="text" name="username" value=""/>
</div>
<div>
    <label for="password">Password</label>
    <input type="password" name="password" value=""/>
</div>
<div id="formbutton">
<input type="submit" name="login" value="Login" />
</div>
</form>
<?php echo $this->render('footer.phtml'); ?>

Шаблон отображает header.phtml и footer.phtml в начале и в конце страницы соответственно. Обратите внимание, что сообщение из переменной $this→message выводится только в том случае, когда ее значение не пусто. Эта переменная используется, если при входе произошла ошибках и пользователю необходимо сообщить о ней. Оставшаяся часть шаблона представляет собой саму форму входа в систему.

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

zf-tutorial/application/controllers/AuthController.php:
class AuthController extends Zend_Controller_Action
{
    ...
    function loginAction()
    {
        $this->view->message = '';
        $this->view->title = "Log in";
        $this->render();
    }
}

Для отображения формы нужно задать ее заголовок и текст сообщения, после чего форму можно будет увидеть, перейдя по URL http://zf-tutorial/auth/login. Возникает вопрос, как в таком случае обрабатывать пересылаемые из нее данные? Для этого мы используем тот же способ, который применялся в случае с формами редактирования и добавления записей в IndexController. То-есть обработка данных будет производиться, только если метод обращения к серверу — POST. В противном же случае, действие login будет просто выдавать форму. Необходимые изменения в loginAction() показаны ниже.

zf-tutorial/application/controllers/AuthController.php:
class AuthController extends Zend_Controller_Action
{
    ...
    function loginAction()
    {
        $this->view->message = '';
        if ($this->_request->isPost()) {
            // collect the data from the user
            Zend_Loader::loadClass('Zend_Filter_StripTags');
            $f = new Zend_Filter_StripTags();
            $username = $f->filter($this->_request->getPost('username'));
            $password = $f->filter($this->_request->
            getPost('password'));
            if (empty($username)) {
                $this->view->message = 'Please provide a username.';
            } else {
                // setup Zend_Auth adapter for a database table
                Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
                $dbAdapter = Zend_Registry::get('dbAdapter');
                $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
                $authAdapter->setTableName('users');
                $authAdapter->setIdentityColumn('username');
                $authAdapter->setCredentialColumn('password');
                // Set the input credential values
                // to authenticate against
                $authAdapter->setIdentity($username);
                $authAdapter->setCredential($password);
                // do the authentication
                $auth = Zend_Auth::getInstance();
                $result = $auth->authenticate($authAdapter);
                if ($result->isValid()) {
                    // success: store database row to auth's storage
                    // system. (Not the password though!)
                    $data = $authAdapter->getResultRowObject(null, 'password');
                    $auth->getStorage()->write($data);
                    $this->_redirect('/');
                } else {
                    // failure: clear database row from session
                    $this->view->message = 'Login failed.';
                }
            }
        }
        $this->view->title = "Log in";
        $this->render();
    }
}

Рассмотрим приведенный выше код пошагово:
// collect the data from the user
Zend_Loader::loadClass('Zend_Filter_StripTags');
$f = new Zend_Filter_StripTags();
$username = $f->filter($this->_request->getPost('username'));
$password = $f->filter($this->_request->getPost('password'));

if (empty($username)) {
    $this->view->message = 'Please provide a username.';
} else {
    ...

Здесь, как обычно, мы извлекаем имя пользователя и пароль из массива POST и обрабатываем их значения HTML-фильтром. Использованная при этом функция getPost() автоматически проверяет наличие задаваемых в ее параметре переменных и, в случае если таковые не обнаружены в POST, возвращает пустое значение.

Процесс аутентификации продолжается, только если имя пользователя задано. В случае пустого значения, попытка выполнить аутентификацию через Zend_Auth возбудила бы исключительную ситуацию.
// setup Zend_Auth adapter for a database table
Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
$dbAdapter = Zend_Registry::get('dbAdapter');
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter->setTableName('users');
$authAdapter->setIdentityColumn('username');
$authAdapter->setCredentialColumn('password');

Для работы с авторизационными данными в Zend_Auth используется подсистема адаптеров. Такие адаптеры предоставляют унифицированный интерфейс к разнотипным хранилищам данных, таких как реляционные БД, LDAP или простые файлы. В нашем примере для этой цели будет используется база данных, поэтому выбран адаптер Zend_Auth_Adapter_DbTable. Для того, чтобы его инициализировать, необходимо задать параметры базы данных (имя таблицы пользователей и названия ее полей).
// Set the input credential values to authenticate against
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);

Так же мы должны передать в адаптер точные значения имени пользователя и пароля, которые были введены в форму.
// do the authentication
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);

Для того, чтобы выполнить саму процедуру аутентификации, выполняется вызов метода authenticate() класса Zend_Auth. При этом результат аутентификации автоматически сохраняется в сессии.
if ($result->isValid()) {
    // success : store database row to auth's storage
    // system. (not the password though!)
    $data = $authAdapter->getResultRowObject(null,
        'password');
    $auth->getStorage()->write($data);
    $this->_redirect('/');

В случае, если аутентификация прошла успешно, учетная запись пользователя из базы данных будет полностью сохранена внутри синглетона Zend_Auth (за исключением пароля, разумеется).
    } else {
        // failure: clear database row from session
        $this->view->message = 'Login failed.';
    }
}

В том случае, если проверка имени пользователя и пароля не прошла, мы сообщить сообщаем об этом пользователю через переменную message. На этом процесс аутентификации для входа в систему завершается.

Выход

Выход из системы осуществляется гораздо проще, чем вход. Все, что для этого потребуется, — очистить данные внутри синглетона Zend_Auth. Это реализуется в действии logoutAction() контроллера AuthController. Таким образом, для выхода потребуется просто перейти на URL http://zftutorial/auth/logout.

zf-tutorial/application/controllers/AuthController.php:
class AuthController extends Zend_Controller_Action
{
    ...
    function logoutAction()
    {
        Zend_Auth::getInstance()->clearIdentity();
        $this->_redirect('/');
    }
}

Функция logoutAction() на столько тривиальна, что комментировать в ней совершенно нечего.

Нам понадобится предоставить пользователю специальную ссылку, перейдя по которой он смог бы выходить из веб-приложения. Проще всего сделать ее внутри шаблона footer. Помимо этого, мы будем сообщать пользователю его имя, для того, чтобы он был уверен, что авторизация прошла успешно. Имена пользователей хранятся в поле real_name соответствующей таблицы базы данных, и могут быть доступны из Zend_Auth. Первое, что понадобится сделать, — передать это значение в вид, что мы и сделаем внутри функции init() контроллера IndexController().

zf-tutorial/application/controllers/IndexController.php:
class IndexController extends Zend_Controller_Action
{
    function init()
    {
        $this->initView();
        Zend_Loader::loadClass('Album');
        $this->view->baseUrl = $this->_request->getBaseUrl();
        $this->view->user = Zend_Auth::getInstance()->getIdentity();
    }
    ...
}

Очень удобно, что Zend_Auth — синглетон. Иначе в данном случае пришлось бы хранить его содержимое в реестре.

Теперь нам понадобится внести изменения в файл footer.phtml.

zf-tutorial/application/views/footer.phtml:
<?php if($this->user) : ?>
<p id="logged-in">Logged in as <?php
    echo $this->escape($this->user->real_name);?>.
<a href="<?php echo $this->baseUrl ?>/auth/logout">Logout</a></p>
<?php endif; ?>
</div>
</body>
</html>

Приведенный код не содержит ничего принципиально нового. Мы используем escape(), чтобы убедиться в том, что имя пользователя будет корректно отображено в браузере. Значение переменной baseUrl применяется для правильного формирования ссылки.

Функции выхода из системы готова.

Защита действий

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

zf-tutorial/application/controllers/IndexController.php:
class IndexController extends Zend_Controller_Action
{
    ...
    function preDispatch()
    {
        $auth = Zend_Auth::getInstance();
        if (!$auth->hasIdentity()) {
            $this->_redirect('auth/login');
        }
    }
    ...
}

Функция со стандартным именем preDispatch() автоматически вызывается перед любым действием контроллера. С помощью метода hasIdentity() объекта Zend_Auth, мы проверяем, выполнен ли вход в систему. И, если это не так, перенаправляем пользователя на auth/login.

На этом работа над авторизацией завершена.

Заключение

Приведенный пример реализации функций пользовательской авторизации на базе Zend Framework достаточно прост, но стоит понимать, что у Zend_Auth существует еще множество полезных возможностей, которые можно использовать для защиты более сложных приложений с несколькими контроллерами. Не была так же затронута система авторизации, реализованная в компоненте Zend_Acl. Последний рассчитан на использование совместно с Zend_Auth для разграничения уровней доступа пользователей к действиям или данным, но это уже тема для отдельного разговора.

Все замечания относительно оригинальной статьи вы можете отправлять ее автору по адресу rob@akrabat.com. Комментарии к русскому переводу шлите на musayev@yandex.ru.

Update: архив с примерами программ из статьи можно найти на сайте автора: zend_auth-tutorial_104.zip.
Перевод: Rob Allen
Alex Musayev @dreikanter
карма
75,1
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (34)

  • –2
    что-то мне кажется, что это то же самое, что писать гостевую книгу на объектах с использованием каких-нибудь крутых фреймворков типа CakePHP - ненужно и глупо...
    или если мы пользуемся ZF, то авторизацию иначе как через Zend_Auth не провести? о_О
    • 0
      Вот в том числе и из-за людей с Вашей точкой зрения иногда приходиться плеваться от взгляда на код.
      • 0
        не стоит говорить раньше времени :)
        и фраз на ветер пускать тоже
    • 0
      Смысл статьи - не доказать, как сделать авторизацию лучше всего в мире, а как это сделать с применением ZF. По-моему, все достаточно понятно.
  • 0
    как обычно получается в итоге - нагромоздили столько, что и на голову не налазит

    никаких претензий к автору и переводчику, но такие вот примеры как раз и показывают, как излишне тяжёлым может быть ООП код в интерпретируемых языках.

    из-за какой-то мелочи подгружается куча классов (для функций которых приходится выделять память), и непонятно, в чём выигрыш собственно?
    • +3
      А как еще можно на примерах разобрать подобный фреймворк-тяжеловес? Не писать же статью "Создаем социальную полный аналог Хабра на Zend Framework"
    • +1
      Именно ZF и помогает не писать каждый раз одно и то же с кучами проверок и фильтров. Первый раз как увидел ZF_Auth, тоже решил. что наворочено и не нужно. А когда попробовал в деле - все оказалось быстро, ясно и приятно. Вот вам и выигрыш.
    • 0
      ZF это комплекс компонент, которые в сумме облегчают разарботку сайта. Не совсем правильно оценивать и гнобить данный фреймворк по конкретному примеру.

      Поддержу den_rad, статья предназначена в первую очередь для знакомства с данным классом.

      Сейчас потихоньку начинаем использовать ZF. Но используем в первую очередь ядро, контроллеры и настройки ... все остальное самописное легко интегрируем с системой. Но постепенно будем переходить полностью на средства ZF, имхо, так будет более правильно для организации проектов на ZF. Тем более что идет слух, что поддержка ZF может появится в самом php.
    • 0
      ZF мне понравился как раз тем, что в нем предусмотрено все, что необходимо и при этом сохранена гибкость благодаря грамотной ОО-реализации. Zend_Auth на учебном примере действительно смотрится как реактивный двигатель на велосипеде, но не нужно забывать, что это не реальная задача, а просто иллюстрация. В ней основное внимание уделено не прикладному предназначению программного продукта, а технологии его реализации. Чтобы можно было вникнуть в эту технологию, не отвлекаясь на предметную область какого-то частного случая. Факт, что ZF расчитан на программы более высокого уровня сложности, чем приведенная в примере. Несложные и автономно-работающие скрипты (мэйл-форма, например, или минимальная по функциям книга гостевая) не слишком выйграет от его применения.
      Но я по своему опыту могу сказать, что все проиллюстрированный здесь и оставшиеся за кадром фичи на реальных задачах найдут свое применение. А благодаря тому, что фреймворк развивается как единое целое, а не набор отдельных компонент, это здорово облегчит задачу сохранения грамотной (и унифицированной) структуры приложения на его основе.

      Очень приятно читать документацию и находить в ней довольно толковые решения многих задач, аналоги которых относительно недавно писал сам :)
  • +1
    Хорошо в таких статьях класть в прицеп архив с рабочим примером.
  • –4
    После беглого просмотра этой и предшествующей статьей окончательно пропадает желание ближе знакомиться как с этим фрэймвоком в частности так и с самим PHP.
    Спасибо!
    • 0
      Хм, выражаете благодарность и ставите отрицительный балл статье. Интересный вы человек.

      P.S. Чем конкретно вас неустроили как PHP в общем и целом, так и конкретные framework'и в частности?
      • 0
        Боюсь не совсем корректно выразился. Отрицательный бал статье я не ставил, наооборот, я благодарен автору, за сэкономленное время. В качестве фрэймворка для изучения я для себя уже выбрал джанго(www.djangoproject.com), в котором,к слову, та же система авторизации - стандартный плагин. Но нет нет да и посматриваю не ошибся ли в выборе, не появилось ли чего лучшего, как схожие задачи решаются в других фрэймвоках. И как раз просматривая такие обзоры с примерами и убеждаюсь насколько правильно я сделал свой выбор) По ПХП - это моё частное неофициально ощущение (надеюсь имею на него право?) Обосновывал я его тут:
        http://recoilme.livejournal.com/1797.html
        • 0
          Имеете, никто у вас его и не отнимает ;).

          Я сам давно присматриваюсь в Django, да вот только руки никак не дойдут... Я бы посоветовал вам посмотреть на Symfony. Этот framework из той же серии, что и Django (Ruby on Rails). Возможно в нем вы найдете для себя что-нибудь интересное.
  • 0
    Спасибо за статью. Почему-то на framework.zend.com не было перевода этого компонента, хотя тема очень нужная.
  • 0
    Давно думал как переделать свой тяп-ляп движок, и вот под руку попался Zend FW, классная штука уже начал думать как на основание его создать новый двигатель, огромное спасибо автору перевода, буду рад видеть продолжение!
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Как я понял, в данном примере авторизационная информация храниться в течении сессии, то есть пока броузер не закрыт. А что надо делать, что бы запомнить пользователя на какое-то время? Есть соответствующие механизмы в Zend_Auth, или надо руками делать?
    • 0
      Если речь идёт о таймауте сессии - это делается через стандартные настройки РНР. Если же нужна ситуация, когда надо закрыть сессию юзера по истечению какого-то времени (довольно странная ситуация) - это можно легко добавить в preDispatch() контроллера, который будет проверять когда юзер залогинился (это время придется сохранить в сессии) и не пора ли его разлогинить.
  • 0
    Вот интересно какие есть плюсы у zend framework по отношению к symfony?
    Кто-нибудь использовал один и другой framework в работе?
    Symfony уже года 2 как из бэтты вышел, а zend framework из бэтты вышел буквально месяц назад.
    Мне в symfony очень понравился генератор CRUD-приложений - это сильно экономит время. Есть такой в zend framework?
    • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Не совсем по теме, но довольно важный нюанс: поле для хранения пароля в MySQL нужно создавать как VARCHAR BINARY, а не просто VARCHAR. Иначе пароль получается case insensitive, и стойкость пароля падает на порядок.
    • 0
      Хранить нужно хеш пароля, потому что:
      1. зачем вам знать пароль пользователя, может у него на почте такой же
      2. кто-нибудь может спереть базу
      3. база кроме вас доступна еще и хостеру
      Хеш нужно сделать понадежней, желательно нестандартным алгоритмом, иначе пароли пожно подобрать перебором (не обязательно совсем новый алгоритм, можно просто чуть поменять результат стандартного).

      В случае хранения хеша необходимость BINARY отпадает.
      • 0
        Всё верно. Только если в базе хеш, то и поле обычно называют не password, а pass_md5 или pass_hash, etc.
        • 0
          Вариант pass_md5 мне совсем не нравиться, особенно если храниться действительно md5, это же подсказка злоумышленнику, а вот pass_hash гораздо лучше, нужно внедрить в свою практику, спасиб.
          • 0
            Security through obscurity - это не очень хорошая идея, особенно если без неё можно обойтись. И уж точно на неё нельзя полагаться как на один из основных механизмов обеспечения безопасности.

            Так что пытаться скрывать алгоритм хеширования смысла мало. Все основные виды хешей обычно визуально определяются, и названием поля алгорим не скроешь. Что касается изменения результата стандартного алгоритма ручками, то обычно это тоже не спасает: дело в том, что в большинстве случаев когда хакер получает доступ к базе, он так же получает и возможность как минимум читать файлы на сервере, в том числе и файл с кодом вычисления и изменения хеша пароля.

            Используйте стойкие алгоритмы хеширования, плюс проверяйте пароль за стойкость (либо перед хешированием, и отказывайтесь принимать от юзера слабые пароли, либо после хеширования - запустив john и требуя чтобы юзеры меняли пароли, которые john смог быстро подобрать).
  • 0
    Спасибо огромное за статью, особенно за ПДФ. Очень удобно распечатывать по 8 страниц на А4 никаких лишних бумажек =)

    Вот я разбираюсь сейчас с мануалом фреймворка. До этого я такими вещами не занимался =)

    Возник вопрос.

    Zend_Auth основывается на Zend_Session или нет. Всмысле пригодится ли мне Zend_Session при использовании Zend_Auth или о нём можно забыть?

    Если вопрос глупый, то прошу прощения.
    • 0
      Zend_Auth по-умолчанию использует PHP сессии для хранения авторизационных данных. Т.е. его можно использовать совместно с Zend_Session, но не обязательно. Подробности здесь: http://framework.zend.com/manual/ru/zend…
      • 0
        Если у меня есть административная часть сайта (CMS), и система авторизации на сайте (назовем "личный кабинет") — как Zend_Auth будет различать два разных типа пользователей? (Работаю на ZF второй месяц %-]).

        Пока думаю что в сессии Zend_Auth хранить ключ `is_admin` или что-то подобное.
        • 0
          Здесь стоит вопрос о разграничении прав доступа к ресурсам. Резонно будет использовать класс, реализующий список прав доступа Zend_Acl.
  • 0
    Кстати во вложенном архиве и в описании замечена ошибка
    zf-tutorial/index.php:
    ...
    $dbAdapter = Zend_Db::factory($config->db->adapter,
    $config->db->config->asArray());
    ...

    Fatal error: Call to undefined method Zend_Config::asArray() in C:\Apache2.2\htdocs\zf.auth2\index.php on line 26

    Рецепт лечения
    $config->db->config->asArray()
    заменить на
    $config->db->config->toArray()
  • 0
    совместное использование с PHPDoctrine (о том, как при использовании доктрины создать аналог Zend_Auth_Adapter_DbTable, чтоб не создавать новый конект для Zend_Db_Table, а использовать конект и классы доктрины): http://www.framework.zend.com/wiki/display/ZFPROP/Zend_Auth_Adapter_Doctrine_Table
  • 0
    идея хорошая. есть ли где-то готовое решение?

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