Как получить роль от Zend_Auth / Zend_ACL при использовании адаптера Doctrine? получать всю работу вместе - PullRequest
1 голос
/ 12 января 2011

Я использую Zend_Auth с проектом, использующим doctrine. Я считаю, что каждая начальная загрузка выполняется правильно, и я могу войти в систему.

мой адаптер выглядит так:

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: spl_autoload () [function.spl-autoload]: не удалось загрузить класс Doctrine_Event. Я видел этот пост здесь , и мне интересно, как это может повлиять на мое использование Zend_Session, и это правда, что я включил apc.dll в моем php.th спасибо за чтение этого

1 Ответ

2 голосов
/ 12 января 2011

Как получить роль: в вашем адаптере, при успешном входе в систему, вместо того, чтобы возвращать только поле имени пользователя, как насчет возврата всего объекта пользователя?Тогда все это будет доступно, когда вы вызовете Zend_Auth::getIdentity().

Вопрос 1. Если вы рассматриваете контроллеры как ресурсы, а правила ACL для каждого модуля будут разными, то имена ресурсов должны отражать модультакже.Это решит проблему модулей с одинаковыми именами контроллеров.

Вопрос 2: Я не уверен, что правильно понимаю.Zend_Auth и его хранилище позаботятся о сохранении идентичности пользователя в своем собственном пространстве имен сеанса.Однако я столкнулся с вопросом, что делать, когда изменяется запись пользователя в БД - скажем, пользователь изменяет свое полное имя в своем профиле во время сеанса входа в систему - и вы отображаете это полное имя в шаблоне своего сайта.вытащил из Zend_Auth::getIdentity().Как пользователь, я ожидал бы, что изменение будет отражено в видимом интерфейсе, но изменение произошло только в БД, а не в сеансе.

В прошлом я создал дополнительный адаптер аутентификации, который выбирает новую запись пользователя и всегда возвращает успех.Когда пользователь обновляет свой профиль, я звоню Zend_Auth::authenticate(), используя этот простой адаптер.Хранилище сессий обновляется и все в порядке с миром.

[Этот подход почти наверняка является хаком, поэтому мне было бы интересно услышать альтернативные подходы.Я уверен, что могу установить значение в хранилище сеанса напрямую, но когда я в последний раз попробовал его, я не смог заставить его работать.Так что прибегаем к дополнительному адаптеру обходного пути.]

...