Управление версиями Zend_Auth - PullRequest
2 голосов
/ 12 марта 2011

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

Я хотел бы иметь возможность проверить, хранятся ли сохраненные данные.Идентификационные данные соответствуют требованиям текущей версии.

Как я вижу из руководства, проверка того, существует ли идентификация, выполняется следующим образом:

$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
    // Identity exists; get it
    $identity = $auth->getIdentity();
}

Но нет возможности подключиться к hasIdentity() метод или где-то еще, чтобы выполнить проверку.

Единственный способ сделать это - реализовать мой собственный класс Zend_Auth_Storage_Interface, который будет использовать другое хранилище в качестве реализации и выполнять проверку сохраненных данных.

Есть ли более правильное решение?

Ответы [ 2 ]

2 голосов
/ 12 марта 2011

Я не совсем уверен, что понимаю, но похоже, что вы неправильно понимаете разницу между авторизацией и аутентификацией.

Zend_Auth - это аутентификация, поэтому вам следует не использовать Zend_Auth для обработки авторизациино Zend_Acl.

Однако, если вы хотите сохранить дополнительную информацию из процесса аутентификации (т.е. аутентификации базы данных), вы можете использовать метод getResultRowObject($returnColumns, $ommitColumns);.

Существует несколько реализаций для получения «объекта строки» в зависимости от вашего текущего адаптера.

Zend_Auth_Storage_Interface предназначен для сохранения результата, я не думаю, что вам нужно будет делать такую ​​реализацию, поскольку речь идет о сохранениинапример, объект идентификации в сеансе или в базе данных.

Вам может потребоваться использовать Zend_Acl и создать список управления доступом, который в общем случае определяет Роль ( может бытьпользователь ), Ресурс ( ваше версионное приложение ), Привилегия ( можно использовать или нет )


Примечание: * У большинства людей возникают трудности с использованием Zend_Acl, потому что они думают в модуле / контроллере / действии, но это всего лишь одинспособ определения ресурса.
Ресурсом может быть все, что вам нужно, все приложение, действие контроллера, представление, другой пользователь, подключение к базе данных и т. д. *

0 голосов
/ 12 марта 2011

Даже если вы приняли ответ выше, я считаю, что вам нужно что-то еще.

$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
    // Identity exists - validate if it's valid

    $identity = $auth->getIdentity();
    if (!HelperClass::validateIdentity($identity)) { //you validation method
         /* User has stored identity from previous version. 
          * It may miss some important info (like a role value
          * you added recently). Clear it and require re-login. */
         $auth->clearIdentity();
         $this->_helper->flashMessenger('Please login ...');
         $this->_helper->redirector('login');
    }
    // identity is valid
    $acl = Acl::factory(); //get acl object somehow
    if (!$acl->isAllowed($module.$controller.$action, $identity->role)) {
         throw new AccessDeniedException();
    }
    // else nothing -> user has valid session data and is allowed to access the resource. 
}
...