Я использую Zend_Auth с проектом, использующим doctrine.I верю, что каждая перезагрузка выполняется правильно, и я могу войти в систему.
мой адаптер выглядит следующим образом:
class Abra_Auth_Adapter_Doctrine implements Zend_Auth_Adapter_Interface { protected $_resultArray; private $username; private $password; public function __construct($username, $password) { $this->username = $username; $this->password = $password; } //based on feedbacks as response authenticate has changed to this public function authenticate() { $q = Doctrine_Query::create() ->from("Abra_Model_User u") ->leftJoin("u.Role r") ->where("u.username=? AND u.password=?", array($this->username,$this->password)); $result = $q->execute(); if (count($result) == 1) { return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $result->get("Mylibrary_Model_User"), array());//autoloaderNamespaces[] = "Mylibrary_" in application.ini } else { return new Zend_Auth_Result(Zend_Auth_Result::FAILURE, null, array("Authentication Unsuccessful")); } }
мой Abra_Controller_Pluging_Acl выглядит так
class Abra_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request) { parent::preDispatch($request); $controller = $request->getControllerName(); $action = $request->getActionName(); $module = $request->getModuleName(); $auth = Zend_Auth::getInstance(); if($auth->hasIdentity()){ $identity = $auth->getIdentity(); $roles = $identity["Role"]; $role = $roles["name"]; $role = (empty ($role) || is_null($role))? "regular" : $role ; } else { $role = "guest"; } }
теперь с Doctrine_Event Fatal error: spl_autoload () [function.spl-autoload]: Класс Doctrine_Event не может быть загружен. Я видел этот пост здесь, и мне интересно, как это повлияет на мое использование Zend_Session, и это правда, что apc.dll включен в моем php.thanks много для чтения этого
Как получить роль: в вашем адаптере, при успешном входе в систему, вместо того, чтобы возвращать только поле имени пользователя, как насчет возврата всего объекта пользователя? Тогда все это будет доступно, когда вы Zend_Auth::getIdentity()
.
Вопрос 1: Если вы рассматриваете контроллеры как ресурсы и правила ACL будут разными для каждого модуля, тогда имена ресурсов также должны отражать модуль. Это затронет проблему модулей с идентичными именами контроллеров.
Вопрос 2: Я не уверен, что правильно понимаю. Zend_Auth и его хранилище позаботятся о сохранении идентификатора uer в собственном пространстве имен сеанса. Однако я столкнулся с проблемой того, что делать, когда пользователь записывает изменения в db – скажем, пользователь изменяет свое полное имя в своем профиле во время сеанса входа в систему – и вы показываете это полное имя в шаблоне вашего сайта , вытащил из Zend_Auth::getIdentity()
. Как пользователь, я ожидал бы, что изменение будет отражено в видимом интерфейсе, но изменение произошло только в db, а не в сеансе.
То, что я делал в прошлом, заключается в создании дополнительного адаптера auth, который извлекает новую запись пользователя и всегда возвращает успех. Когда пользователь обновляет свой профиль, я вызываю Zend_Auth::authenticate()
используя этот тривиальный адаптер. Хранение сеансов обновляется, и все хорошо с миром.
[Этот подход почти наверняка является взломом, поэтому мне было бы интересно услышать альтернативные подходы. Я уверен, что я могу установить значение в хранилище сеансов напрямую, но когда я в последний раз его пробовал, я не мог заставить его работать. Так что прибегают к обходу дополнительного адаптера.]