edit : это дополнение к ответу @singles.
Вы должны понимать, что есть 2 разные вещи. Auth и Acl . Auth сообщает вам, кто является пользователем, и вы можете, например, перенаправить пользователя, не имеющего Auth, на ваш контроллер входа в систему и установить идентификатор аутентификации после входа в систему. затем система Acl принимает решения «да / нет» на основе данных аутентификации (это может быть идентификатор пользователя или роль, хранящаяся в хранилище аутентификации.
Хорошим решением является наличие 2 плагинов контроллеров (зарегистрированных в хорошем порядке на начальной загрузке, Auth затем Acl). Если вы не используете плагины контроллера, вам придется при необходимости вызывать проверку Acl на каждом контроллере. Если вам это всегда нужно, используйте плагины.
Реализуйте в себе preDispatch()
плагин Auth для установки, например, анонимной идентификации, если у вас нет идентификатора, возвращаемого из Zend_Auth.
Это фрагмент кода реального:
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
$auth = Zend_Auth::getInstance();
if (!$auth->hasIdentity()) {
// set a default anonymous identity
$auth->getStorage()->write(array('name' => 'anonymous','role' => 1,));
}
(...)
А для плагина контроллера Acl задача также в preDispatch()
. Вы можете запустить проверку ACL для каждого запрошенного URL (так для каждого пользовательского запроса, даже AJAX). Вот частичный фрагмент, так что это всего лишь пример того, как вы можете справиться с вещами:
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$controller = $request->controller;
$module = $request->module;
$action = $request->action;
// here you should code something nice retrieving you Zend_Acl object
// with some caching options maybe, building roles, ressources, etc
$this->_acl = $this->getAcl();
if (!$this->_acl->isCurrentUserAllowed($module,'see')) {
$auth = Zend_Auth::getInstance();
$identity = $auth->hasIdentity('identity')? $auth->getIdentity() : null;
if(isset($identity)) {
if($identity['name'] == 'anonymous') {
// WARNING: avoid infinite redirect loops on login page
if (!($request->getControllerName() == 'login'
&& $request->getActionName()=='login'
&& $request->getModuleName() == 'default')) {
$request->setControllerName('login')
->setActionName('login')
->setModuleName('default');
return;
(...)
и в этой системе последняя важная часть - это LoginController, где в случае успешного входа в систему вы должны инициировать идентификационную запись:
(...)
$auth = Zend_Auth::getInstance();
Zend_Session::regenerateId();
$storage = $auth->getStorage();
$rowobject = $authAdapter->getResultRowObject(null,'passwd');
$storage->write((array)$rowobject);
(...)