2011-01-12 4 views
1

Я использую Zend_Auth с проектом с использованием doctrine.I считаю, что каждый самонастройки сделано правильно, и я могу войти вКак получить роль от Zend_Auth/Zend_ACL при использовании адаптера 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 не может быть загружен. я видел это post here, и мне интересно, как это может повлиять на мое использование Zend_Session, и это правда, что у меня есть apc.dll в моем php.thanks много для чтения этого

ответ

2

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

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

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

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

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

+0

спасибо за то, что вы использовали письмо all.i've отредактируйте мое сообщение, чтобы вопрос 2 был более ясным. –

+0

привет, я обновил сценарий с результатами и проблемами, обнаруженными при реализации ваших идей. Я надеюсь, что другие люди смогут вмешаться и теперь поделиться своим опытом. В любом случае –

+0

Роль - это массив? Определена ли модель User с hasMany («Роль»)? Как отдельная мысль, почему вы хотите, чтобы адаптер auth преобразовывал все в массив. Doctrine создает граф объекта; почему бы не сохранить его? –

 Смежные вопросы

  • Нет связанных вопросов^_^