Просмотрите Zend ___ Acl , который можно использовать для определения, имеет ли пользователь доступ к определенным ресурсам. Ресурс может быть почти любым, но в этом контексте вы можете использовать ACL для определения ваших контроллеров и действий как ресурсов. Каждому вошедшему в систему пользователю назначается определенное количество ролей (мы сохраняем их в базе данных). В плагине вы проверяете запрос на Controller и Action после завершения маршрутизации. Соберите роли пользователя через Zend_Auth и сравните их с ACL. Если ACL сообщает, что у пользователя есть разрешение на доступ к ресурсу, ничего не делайте, иначе вы можете переадресовать / перенаправить на контроллер ошибок и распечатать ошибку.
// Pseudo-code. You need to define the ACL and roles somehow.
class AclPlugin extends Zend_Controller_Plugin {
public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
$controller = $request->getControllerName();
$action = $request->getActionName();
$roles = Zend_Auth::getInstance()->getRoles();
$acl = new MyAcl();
if($acl->hasAccess($roles, $controller, $action)) { return; }
// None of the user's roles gave her access to the requested
// controller/action, so re-write the request to the error controller
$request->setControllerName('error')
->setActionName('authorizationFailed')
->setParam('resource', array('controller' => $controller
'action' => $action));
}
}
class MyAcl extends Zend_Acl {
public function hasAccess($roles, $controller, $action) {
foreach($roles as $role) {
if($acl->isAllowed($role, $controller, $action)) {
return true; // Simplified. Here we say if one of the user roles can
// access a resource, that is good enough.
// Might want to do something a bit more complicated.
}
}
return false;
}
}