Zend_Auth身份版本控制

时间:2011-03-12 12:43:55

标签: php zend-framework versioning zend-auth

有一种情况:我将一些结构化数据(例如数组或对象,甚至字符串)存储为Zend_Auth标识。从版本到版本,身份结构可以更改,因此一个版本的身份可以(或不能)与另一个版本的应用程序代码兼容。

我希望能够验证存储的身份数据是否符合当前的版本要求。

正如我在手册中看到的,验证身份是否存在的执行方式如下:

$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
    // Identity exists; get it
    $identity = $auth->getIdentity();
}

但是没有能力挂钩hasIdentity()方法或其他地方来执行验证。

我认为这样做的唯一方法是实现我自己的Zend_Auth_Storage_Interface类,该类将使用其他存储作为实现并执行存储数据的验证。

还有更合适的解决方案吗?

2 个答案:

答案 0 :(得分:2)

我并不完全明白,但看起来你误解了授权和身份验证之间的区别。

Zend_Auth是关于身份验证的,因此你应该使用Zend_Auth来处理授权,但Zend_Acl。

但是,如果您想要存储来自身份验证过程的其他信息(即数据库身份验证),您可以使用getResultRowObject($returnColumns, $ommitColumns);方法。

根据您当前的适配器,有几种实现来获取“行对象”。

Zend_Auth_Storage_Interface是关于存储结果的,我不认为你需要做这样的实现,因为它是关于在会话或数据库中存储身份对象。

您可能需要使用Zend_Acl并构建一​​个访问控制列表,该列表一般定义角色可以是用户),资源您的版本应用),权限可以使用或不使用


注意: *大多数人都难以使用Zend_Acl,因为他们认为在Module / Controller / Action中,但这只是定义资源的一种方式。
资源可以是您想要的任何内容,整个应用程序,控制器操作,视图,另一个用户,数据库连接等。*

答案 1 :(得分:0)

即使您接受了上述答案,我相信您还需要别的东西。

$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
    // Identity exists - validate if it's valid

    $identity = $auth->getIdentity();
    if (!HelperClass::validateIdentity($identity)) { //you validation method
         /* User has stored identity from previous version. 
          * It may miss some important info (like a role value
          * you added recently). Clear it and require re-login. */
         $auth->clearIdentity();
         $this->_helper->flashMessenger('Please login ...');
         $this->_helper->redirector('login');
    }
    // identity is valid
    $acl = Acl::factory(); //get acl object somehow
    if (!$acl->isAllowed($module.$controller.$action, $identity->role)) {
         throw new AccessDeniedException();
    }
    // else nothing -> user has valid session data and is allowed to access the resource. 
}