2

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

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

正如我从手册中看到的,身份是否存在的验证是这样执行的:

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

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

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

有没有更合适的解决方案?

4

2 回答 2

2

我不确定是否完全理解,但您似乎误解了授权和身份验证之间的区别。

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

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

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

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

您可能想要的是使用 Zend_Acl 并构造一个访问控制列表,该列表通常定义一个角色可以是用户)、一个资源您的版本化应用程序)、一个权限可以使用或不使用


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

于 2011-03-12T13:14:36.210 回答
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. 
}
于 2011-03-12T15:42:19.220 回答