有一种情况:我将一些结构化数据(例如数组或对象,甚至字符串)存储为Zend_Auth标识。从版本到版本,身份结构可以更改,因此一个版本的身份可以(或不能)与另一个版本的应用程序代码兼容。
我希望能够验证存储的身份数据是否符合当前的版本要求。
正如我在手册中看到的,验证身份是否存在的执行方式如下:
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
// Identity exists; get it
$identity = $auth->getIdentity();
}
但是没有能力挂钩hasIdentity()
方法或其他地方来执行验证。
我认为这样做的唯一方法是实现我自己的Zend_Auth_Storage_Interface
类,该类将使用其他存储作为实现并执行存储数据的验证。
还有更合适的解决方案吗?
答案 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.
}