我正在使用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。我已经看到了这个post here,我想知道这会如何影响我对Zend_Session的使用,而且我的php.thanks已经启用了apc.dll,这对于阅读这个很有用
答案 0 :(得分:2)
如何获得角色:在您的适配器中,成功登录,而不是仅返回用户名字段,如何返回整个用户对象?然后,当您致电Zend_Auth::getIdentity()
时,整个事情都可用。
问题1:如果将控制器视为资源,并且每个模块的ACL规则不同,那么资源名称也应该反映模块。这将解决具有相同控制器名称的模块的问题。
问题2:我不确定我是否理解正确。 Zend_Auth及其存储将负责将其身份保存在自己的会话命名空间中。但是,我遇到了当数据库中的用户记录发生变化时要做什么的问题 - 比如,用户在登录会话期间在他的个人资料中修改了他的全名 - 并且您在网站模板中显示该全名,从Zend_Auth::getIdentity()
拉出来。作为用户,我希望更改能够反映在可见界面中,但更改只发生在数据库中,而不是在会话中。
我过去所做的是创建一个额外的auth适配器来获取新用户记录并始终返回成功。当用户更新他的个人资料时,我使用这个简单的适配器呼叫Zend_Auth::authenticate()
。会话存储得到更新,一切都很好。
[这种方法几乎肯定是一种黑客行为,所以我有兴趣听取替代方法。我确信我可以直接在会话存储中设置一个值,但是当我上次尝试它时,我无法使它完全正常工作。因此采用了额外的适配器解决方法。]