Zend Framework ACL для раздела администратора сайта

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

http://codepaste.net/6hzydv

Спасибо


person Rik89    schedule 10.04.2012    source источник


Ответы (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/

person Richard Knop    schedule 10.04.2012
comment
Я видел это сообщение в блоге, но мои знания о структуре слишком малы, чтобы понять, куда идет каждый файл, мне также понадобится что-то с контроллерами представления и более подробные объяснения. - person Rik89; 11.04.2012
comment
проверить Zend_Controller_Plugin_Acl - person Alex; 11.04.2012

Прочтите документацию по Zend Acl и узнайте, как предоставлять разрешения и наследовать их по типу пользователя. Тогда ознакомьтесь с этим довольно простым руководством по Zend. Acl и MVC.

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

  1. настроить правила ACL где-нибудь в вашем бутстрапе
  2. crate error/denied.phtml (или любое другое расширение, которое вы используете)
  3. пусть Zend_Controller_Plugin_Acl сделает за вас грязную работу
person Alex    schedule 11.04.2012