Рекомендую книгу «Zend Framework в действии» от Manning Publications как отличное, современное введение в эту тему. Он доступен для скачивания в формате PDF, поэтому вы можете получить его сейчас:)
Но чтобы ответить на этот конкретный вопрос:
Давайте начнем с определения двух ключевых терминов.
«Аутентификация» в Zend_Auth относится к аутентификации, которая доказывает, что кто-то является тем, кем, по его словам, он является (то есть логином).
«A» в Zend_Acl относится к авторизации, которая доказывает, что кто-то имеет право делать то, что он пытается сделать (то есть контроль доступа).
Предполагая, что пользователь имеет одну роль ...
Сохраните роли пользователя в «идентичности», которую вы получаете как часть 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');
}
Если личность пользователя не может делать "новости-> добавить", он будет перенаправлять их на неавторизованную страницу (при условии, что вы создали такую страницу).
Если бы у пользователя было> 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');
}
Надеюсь, это поможет.