如何在使用Doctrine适配器时从Zend_Auth / Zend_ACL获取角色?让所有人一起工作

时间:2011-01-12 00:59:11

标签: php zend-framework doctrine zend-auth zend-acl

我正在使用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,这对于阅读这个很有用

1 个答案:

答案 0 :(得分:2)

如何获得角色:在您的适配器中,成功登录,而不是仅返回用户名字段,如何返回整个用户对象?然后,当您致电Zend_Auth::getIdentity()时,整个事情都可用。

问题1:如果将控制器视为资源,并且每个模块的ACL规则不同,那么资源名称也应该反映模块。这将解决具有相同控制器名称的模块的问题。

问题2:我不确定我是否理解正确。 Zend_Auth及其存储将负责将其身份保存在自己的会话命名空间中。但是,我遇到了当数据库中的用户记录发生变化时要做什么的问题 - 比如,用户在登录会话期间在他的个人资料中修改了他的全名 - 并且您在网站模板中显示该全名,从Zend_Auth::getIdentity()拉出来。作为用户,我希望更改能够反映在可见界面中,但更改只发生在数据库中,而不是在会话中。

我过去所做的是创建一个额外的auth适配器来获取新用户记录并始终返回成功。当用户更新他的个人资料时,我使用这个简单的适配器呼叫Zend_Auth::authenticate()。会话存储得到更新,一切都很好。

[这种方法几乎肯定是一种黑客行为,所以我有兴趣听取替代方法。我确信我可以直接在会话存储中设置一个值,但是当我上次尝试它时,我无法使它完全正常工作。因此采用了额外的适配器解决方法。]