2012-04-10 2 views
0

Итак, у меня есть приложение zf с системой входа пользователя, которая направляет человека в ограниченную зону, если учетные данные находятся в базе данных. Тем не менее, я хочу, чтобы одна и та же форма входа проверяла, является ли роль пользователя администратором (в БД), и если она направляется непосредственно в раздел администратора ... Я изо всех сил пытаюсь разобраться, как это сделать, используя Zend_Acl. Кроме того, единственное использование ACL - это разрешить пользователям с администратором роли admin, я довольно новичок в ZF, поэтому я не уверен, что лучший подход. Вот мой текущий код для AuthControllerZend Framework ACL для раздела администратора сайта

http://codepaste.net/6hzydv

Благодаря

ответ

2

Вы можете создать плагин контроллера, который будет решать, если пользователь имеет привилегии для доступа контроллера/представление, основанное на его роли. Что-то вроде:

class My_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $auth = Zend_Registry::getInstance()->get('auth'); 
     $acl = new Zend_Acl(); 

     // for default module 
     if ($request->getModuleName() == 'default') { 

      // access resources (controllers) 
      // usually there will be more access resources 
      $acl->add(new Zend_Acl_Resource('index')); 
      $acl->add(new Zend_Acl_Resource('error')); 

      // access roles 
      $acl->addRole(new Zend_Acl_Role('guest')); 
      $acl->addRole(new Zend_Acl_Role('user')); 
      $acl->addRole(new Zend_Acl_Role('administrator')); 

      // access rules 
      $acl->allow('guest'); // allow guests everywhere 
      $acl->allow('user'); // allow users everywhere 
      $acl->allow('administrator'); // allow administrators everywhere 

      $role = ($auth->getIdentity() && $auth->getIdentity()->status = 'approved') 
      ? $auth->getIdentity()->role : 'guest'; 
      $controller = $request->getControllerName(); 
      $action = $request->getActionName(); 

      if (!$acl->isAllowed($role, $controller, $action)) { 
       $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector'); 
       $redirector->gotoUrlAndExit('error/denied'); 
      } 

     } 
     // for member module 
     else if ($request->getModuleName() == 'member') { 

      // access resources (controllers) 
      // usually there will be more access resources 
      $acl->add(new Zend_Acl_Resource('index')); 
      $acl->add(new Zend_Acl_Resource('error')); 

      // access roles 
      $acl->addRole(new Zend_Acl_Role('guest')); 
      $acl->addRole(new Zend_Acl_Role('user')); 
      $acl->addRole(new Zend_Acl_Role('administrator')); 

      // access rules 
      $acl->allow('user'); // allow users everywhere 
      $acl->allow('administrator'); // allow administrators everywhere 

      $role = ($auth->getIdentity() && $auth->getIdentity()->status = 'approved') 
      ? $auth->getIdentity()->role : 'guest'; 
      $controller = $request->getControllerName(); 
      $action = $request->getActionName(); 

      if (!$acl->isAllowed($role, $controller, $action)) { 
       $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector'); 
       $redirector->gotoUrlAndExit('error/denied'); 
      } 

     } 
     // for admin module 
     else if ($request->getModuleName() == 'admin') { 

      // access resources (controllers) 
      // usually there will be more access resources 
      $acl->add(new Zend_Acl_Resource('index')); 
      $acl->add(new Zend_Acl_Resource('error')); 

      // access roles 
      $acl->addRole(new Zend_Acl_Role('guest')); 
      $acl->addRole(new Zend_Acl_Role('user')); 
      $acl->addRole(new Zend_Acl_Role('administrator')); 

      // access rules 
      $acl->allow('administrator'); // allow administrators everywhere 

      $role = ($auth->getIdentity() && $auth->getIdentity()->status = 'approved') 
      ? $auth->getIdentity()->role : 'guest'; 
      $controller = $request->getControllerName(); 
      $action = $request->getActionName(); 

      if (!$acl->isAllowed($role, $controller, $action)) { 
       $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector'); 
       $redirector->gotoUrlAndExit('error/denied'); 
      } 

     } 
    } 
} 

Вы можете увидеть шаг за шагом учебник здесь: http://blog.richardknop.com/2009/06/user-login-and-authentication-with-zend_auth-and-zend_acl/

+0

Я видел это сообщение в блоге, но мои знания о структуре слишком малы, чтобы понять, куда идет каждый файл. Мне нужно что-то с контроллерами представлений. l и более подробно объяснения .. – Rik89

+0

проверить 'Zend_Controller_Plugin_Acl' – Alex

0

чтение документации на Zend Acl и понять, как дать разрешения и наследовать их по типу пользователя. Тогда проверьте это довольно simple Zend tutorial on Zend Acl & MVC.

В принципе вы просто должны сделать следующее:

  1. правила настройки ACL где-нибудь в загрузчике
  2. обрешетка error/denied.phtml (или любой другой внутр вы используете)
  3. пусть Zend_Controller_Plugin_Acl делать грязную работу за вас
Смежные вопросы