2011-03-12 39 views
2

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

我想有一个能力来验证存储的身份数据是否符合当前版本的要求。

当我从手动看到的,是否存在身份验证等进行:

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

但是没有挂接到hasIdentity()方法的能力或其他地方进行验证。

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

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

回答

2

我不完全确定要理解,但它看起来像误解了授权和身份验证之间的区别。

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

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

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

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

你可能想要的是使用Zend_Acl中,构建其一般定义角色的访问控制列表可以是用户),一个资源您的版本-ED申请),一个特权可以使用或不能


注: *大多数人有困难,使用ž end_Acl是因为他们在模块/控制器/操作中思考,但它只是定义资源的一种方法。
资源可以是任何你想要的,一个完整的应用程序,一个控制器动作,视图,另一个用户,数据库连接等*

+0

你完全正确。我使用Zend_Auth对用户进行身份验证,并使用Zend_Acl对其进行授权(在preDispatch上过滤导航和验证权限)。 但我怎么能通过Zend_Acl确定身份是错误的?它是否意味着该用户没有任何权限或类似的东西? – 2011-03-12 13:49:56

+0

更具体一点:该网站只包含会员区。这意味着当用户未登录时,必须显示登录表单而不是任何页面。否则,当用户登录时,他应该看到他被允许访问的那部分网站。所以可能在错误身份的情况下,我必须确定用户的角色为“匿名”,而不是将其作为匿名进行处理。 – 2011-03-12 14:01:55

+0

你是对的,因为角色的工作原理,你可以从较不宽容的角色继承他们到最强大的角色。我通常使用guest作为我的起始角色,具有访问登录页面和登录的唯一权限,然后提升权限。 – 2011-03-12 14:12:08

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. 
} 
+0

没错,但我希望“当前用户是否已登录”的逻辑被封装在某个特定位置。这将允许在多个地方重复使用该逻辑,而没有风险可以释放某些事物。 Acl似乎是那个地方的无情。在你的hasIdentity()验证示例中,它的验证分布在两个不同的类(代码片断)之间,这使得逻辑更加紧密。 – 2011-03-12 16:52:36

+3

AcL不适合IMO。 ACL接收登录用户并决定用户是否可以访问某些资源。它不应该决定用户是否登录... – 2011-03-13 12:20:56