我推荐曼宁出版的书“Zend框架在行动”作为一个伟大的,跟上时代的,介绍这一点。它的问世为PDF格式下载,这样你就可以拥有它现在:)
但是,为了回答这个特定问题:
让我们先来定义两个关键术语开始。 Zend_Auth中的“身份验证”指身份验证,它证明某人是他们所说的人(即登录)。 Zend_Acl中的“A”是指授权,它证明某人有权做他们想做的事(即访问控制)。
假设用户只有一个角色... 将用户的角色存储在Zend_Auth的一部分“身份”中。 在登录:
$auth = Zend_Auth::getInstance();
$identity = new stdClass();
$identity->user_pk = $user->getPrimaryKey();
$identity->user_name = $user->getName();
$identity->role = $user->getRole(); // select * from user_role where user_pk=xxx
$auth->getStorage()->write($identity);
在控制器:
$acl->add(new Zend_Acl_Resource('news'))
->allow('defaultRole', 'news');
一切都在默认情况下拒绝,所以你并不真的需要指定:
->deny('defaultRole', 'news', 'add');
而且在控制器的代码:
$identity = Zend_Auth::getInstance()->getIdentity();
if(!$acl->isAllowed($identity->role, 'news', 'add'))
{
header('Location: http://www.yoursite.com/error/unauthorized');
}
如果用户的身份不被允许执行“news-> add”,它会将它们重定向到未经授权的页面(假设您已经创建了这样一个页面)。
如果用户具有> 1的角色,您将存储角色数组作为他们的身份。 然后你的支票会去是这样的:
$identity = Zend_Auth::getInstance()->getIdentity();
$isAllowed = false;
foreach($identity->role as $role)
{
if($acl->isAllowed($role, 'news', 'add'))
{
$isAllowed = true;
}
}
if(!$isAllowed)
{ // if NO ROLES have access, redirect to unauthorized page
header('Location: http://www.yoursite.com/error/unauthorized');
}
希望有所帮助。
为什么这个答案实际上是一个问题? – coderama 2013-07-25 08:28:38