Zend множественная навигация с ACL - PullRequest
2 голосов
/ 14 марта 2012

Я пытаюсь создать интерфейсное и внутреннее меню навигации. Я хочу отображать только фоновое меню в фоновом режиме и наоборот.

Это работает правильно, когда я отключил ACL. Но когда я надеваю, меню исчезло. Кто-нибудь знает, как я могу решить это?

Это мой код:

EDIT:

Я изменил файл navigation.xml, и теперь он работает почти правильно.

Элементы верхнего меню работают, когда я разрешаю контроллер. Но когда я хочу разрешить только определенное действие внутри контроллера, вместо разрешенного действия отображается все подменю.

Надеюсь, вы понимаете проблему. Извините, мой английский не очень хорошо.

в bootstrap.php

protected function _initNavigation()
{
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView(); 

    $identity = $this->_auth->getStorage()->read();
    if($identity)
    {
        $roles = new Application_Model_Auth_Roles();
        $role = $roles->getRoles($identity->role);
    } else {
        $role[0]['role'] = 'Guest';
    }

    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
    $container = new Zend_Navigation($config);

    $view->navigation($container)
                    ->setAcl($this->_acl)
                    ->setRole($role[0]['role']);

    // default menu         
    $view->nav = $view->navigation()->findOneByLabel('mainnav');

}

CmsControllor.php

class CmsController extends Zend_Controller_Action
{
    public function init()
    {

        //// BUILD MENU
        $this->view->nav = $this->view->navigation()->findOneByLabel('cms');

        ...

вид:

<?= $this->navigation()->menu()->renderMenu($this->nav); ?>

navigation.xml

    <config>
  <nav>
  <mainnav>
     <label>mainnav</label>
     <module>default</module>
     <pages>
            <home>
                <label>Home</label>
                <controller>index</controller>
                <resource>index</resource>
            </home>

            <page1>
                <label>De Esdoorn</label> 
                <controller>page1</controller>
                <resource>deesdoorn</resource>

            </page1>

            <page2>
                <label>page2</label>
                <controller>page2</controller>

                <pages>
                    <algemeen>
                        <label>Algemeen</label>
                        <controller>page2</controller>
                        <action>index</action>
                        <resource>page2</resource>
                        <privileges>index</privileges>
                    </algemeen>
                    <biedt>
                        <label>page2 biedt</label>
                        <controller>page2</controller>
                        <action>biedt</action>  
                        <privileges>biedt</privileges>

                    </biedt>
                    <zorg>
                        <label>Zorg</label>
                        <controller>page2</controller>
                        <action>zorg</action>  
                        <privileges>zorg</privileges> 
                    </zorg>
                    <download>
                        <label>Download onze folder</label>
                        <uri>folder url</uri>
                        <target>_blank</target>
                    </download>

                </pages>        
            </page2>

            <organisatie>
                <label>Onze organisatie</label>
                <controller>organisatie</controller>

                <pages>
                    <algemeen>
                        <label>Algemeen</label>
                        <controller>organisatie</controller>
                        <resource>organisatie</resource> 
                        <privileges>index</privileges> 
                    </algemeen>
                    <missieenvisie>
                        <label>Missie en visie</label>
                        <controller>organisatie</controller>
                        <action>missieenvisie</action> 
                        <privileges>missieenvisie</privileges> 

                    </missieenvisie>
                    <dienstverlening>
                        <label>Dienstverlening</label>
                        <controller>organisatie</controller>
                        <action>dienstverlening</action> 
                        <privileges>dienstverlening</privileges> 
                    </dienstverlening>
                    <kosten>
                        <label>Kosten</label>
                        <controller>organisatie</controller>
                        <action>kosten</action>
                        <privileges>kosten</privileges> 
                    </kosten>

                    <nieuws>
                        <label>Nieuws</label>
                        <controller>organisatie</controller>
                        <action>nieuws</action>
                        <privileges>nieuws</privileges> 
                    </nieuws>





                </pages>        
            </organisatie>

            <contact>
                <label>Contact</label> 
                <controller>contact</controller>
                <resource>contact</resource>
            </contact>
     </pages>
  </mainnav>

  <cms>
     <label>cms</label>
     <module>default</module>
     <pages>
            <dashboard>
                <label>Dashboard</label>
                <controller>cms</controller>
                <action>dashboard</action>
                <resource>cms</resource>
                <privileges>nieuws</privileges>
            </dashboard>

            <nieuwsbeheren>
                <label>Beheer uw nieuws</label> 
                <controller>cms</controller>
                <action>managenews</action>
                <resource>cms</resource>
            </nieuwsbeheren>

            <fotoalbum>
                <label>Foto album</label>
                <controller>fotoalbum</controller>
                <pages>
                    <index>
                        <label>Album overzicht</label>
                        <controller>fotoalbum</controller>
                         <privileges>index</privileges>
                    </index>
                    <add>
                        <label>+ Album toevoegen</label>
                        <controller>fotoalbum</controller>
                        <action>add</action>
                        <resource>fotoalbum</resource>
                        <privileges>add</privileges>
                    </add>
                    <clientoverview>
                        <label>Bewoner overzicht</label>
                        <controller>fotoalbum</controller>
                        <action>clientoverview</action>
                        <privileges>clientoverview</privileges>
                    </clientoverview>

                    <useroverview>
                        <label>Naaste overzicht</label>
                        <controller>fotoalbum</controller>
                        <action>useroverview</action>
                        <privileges>useroverview</privileges>
                    </useroverview>


                </pages>        
            </fotoalbum>
            <settings>
                <label>Instellingen</label>
                <controller>cms</controller>
                <action>settings</action>
                <resource>cms</resource>
                <privilege>settings</privilege>
            </settings>
            <logout>
                <label>Uitloggen</label>
                <controller>cms</controller>
                <action>logout</action>
                <resource>cms</resource>
                <privilege>logout</privilege>
            </logout>
     </pages>
  </cms>
 </nav>
 </config>

Мой плагин ACL:

class My_Plugins_CheckAccess extends Zend_Controller_Plugin_Abstract
{

private $_acl = NULL;
private $_auth = NULL;

public function __construct(Zend_Acl $acl, Zend_Auth $auth)
{
    $this->_acl = $acl;
    $this->_auth = $auth;
}

public function preDispatch(Zend_Controller_Request_Abstract $request){

    $controller = $request->getControllerName();
    $action     = $request->getActionName();

    $identity = $this->_auth->getStorage()->read();
    if($identity)
    {
        $roles = new Application_Model_Auth_Roles();
        $role = $roles->getRoles($identity->role);
    } else {
        $role[0]['role'] = 'Guest';
    }

    if(!$this->_acl->isAllowed($role[0]['role'],$controller,$action))
    {
        $request->setControllername('login')->setActionName('index');
    } else
    {

    }

}

Файл моих правил (правила взяты из базы данных)

class Application_Model_Auth_CmsAcl extends Zend_Acl {

public function __construct(){

    $logic = new Application_Model_Auth_Logic();

    $pages  = new Application_Model_Auth_Pages();
    $pagecollection = $pages->getPages();
    $pagelist = $logic->listPages($pagecollection);

    $roles  = new Application_Model_Auth_Roles();
    $rolecollection = $roles->getRoles();

    $resources  = new Application_Model_Auth_Resources();
    $resourcecollection = $resources->getResource();

    foreach($pagelist as $controller)
    {

        if($controller['controllerBase'] == 1): 
            $this->add( new Zend_Acl_Resource($controller['controller']));
        endif; 

    }

    foreach($rolecollection as $role)
    {
        $this->addRole( new Zend_Acl_Role($role['role']));
    }

    foreach($resourcecollection as $resource)
    {
        $roleName = $roles->getRoles($resource['roleID']);
        $pageName = $pages->getPages($resource['pageID']);
        if($pageName[0]['action'] != ''){
            $this->allow($roleName[0]['role'],$pageName[0]['controller'],$pageName[0]['action']);
        } else {$this->allow($roleName[0]['role'],$pageName[0]['controller']);}
    }

}

 }  

Это мой первый веб-сайт Zend. Пожалуйста, поправьте меня, когда я делаю ошибки.

Ответы [ 4 ]

1 голос
/ 14 марта 2012

Похоже, вы обменяли ресурс на привилегию в вашем navigation.xml

Попытка:

<home>
    <label>Home</label>
    <controller>index</controller>
    <resource>index</resource>
<home>

<page1>
    <label>page1</label> 
    <controller>page1</controller>
    <resource>page1</resource>    
<page1>
0 голосов
/ 15 марта 2012

Хорошо, я отредактировал это правило в моем файле правил:

$this->allow($roleName[0]['role'],$pageName[0]['controller'],$pageName[0]['action']);

до

$this->allow($roleName[0]['role'],$pageName[0]['controller'],array('index',$pageName[0]['action']));

Итак, я прикрепил к своему действию массив, в который включен индекс. Это значит, что это работает. но он всегда показывает страницу индекса, когда я хочу разрешить только определенное действие.

Я обнаружил, что это, конечно, вполне логично, поскольку элемент верхнего меню запускается только всем контроллером или действием index.

Для этого необходимо прикрепить этот код к верхнему пункту меню:

<resource>page2</resource>
<privilege>index</privilege>

Решением может быть пользовательский плагин меню, который запускает только верхний пункт меню, когда индекс или другое действие внутри контроллера разрешено.

Или, может быть, кто-то знает, как установить несколько привилегий для пункта верхнего меню? Как то так? * 1016

<page2>
                <label>page2</label>
                <controller>page2</controller>
                <privilege>index</privilege>
                <privilege>zorg</privilege>
                <privilege>biedt</privilege>

                <pages>
                    <algemeen>
                        <label>Algemeen</label>
                        <controller>page2</controller>
                        <action>index</action>
                        <resource>page2</resource>
                        <privilege>index</privilege>
                    </algemeen>
                    <biedt>
                        <label>page2 biedt</label>
                        <controller>page2</controller>
                        <action>biedt</action>  
                        <privilege>biedt</privilege>

                    </biedt>
                    <zorg>
                        <label>Zorg</label>
                        <controller>page2</controller>
                        <action>zorg</action>  
                        <privilege>zorg</privilege> 
                    </zorg>
                    <download>
                        <label>Download onze folder</label>
                        <uri>folder url</uri>
                        <target>_blank</target>
                    </download>

                </pages>        
            </page2>

Таким образом, когда привилегия - ИЛИ индекс, ИЛИ biedt, ИЛИ Zorg -> показать этот верхний пункт меню.

Еще одна ошибка, которую я сделал, -

<privileges> вместо <privilege>

Спасибо за помощь.

0 голосов
/ 14 марта 2012

В вашем навигационном файле вам нужно добавить тег ресурса:

<admin>
     <label>admin</label>
     <module>admin</module>
     <resource>admin</resource>
     <pages>
          ...
     </pages>
</admin>

В этом примере я дал ресурсу имя «admin», но это будет ресурс администратора, который есть в вашей базе данных, и пользователю admin потребуется разрешение для просмотра / доступа к этому ресурсу.

0 голосов
/ 14 марта 2012

Вы еще не указали никаких правил.Это должно быть сделано, чтобы компонент ACL знал, кто к чему имеет доступ.Это можно сделать, позвонив по номеру deny() и / или allow().Взгляните на руководство , оно подробно объясняется.

...