【问题标题】:Zend multiple navigation with ACLZend 使用 ACL 进行多重导航
【发布时间】:2012-03-14 09:30:26
【问题描述】:

我正在尝试构建一个前端和后端导航菜单。 我只想在后端显示后端菜单,反之亦然。

当我关闭 ACL 时,它工作正常。但是,当我穿上时,菜单不见了。 有谁知道,我该如何解决这个问题?

这是我的代码:

编辑:

我更改了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); ?>

导航.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 网站。当我犯错时请纠正我。

【问题讨论】:

    标签: php zend-framework navigation acl


    【解决方案1】:

    看起来你已经在你的 navigation.xml 中用资源交换了权限

    试试:

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

    【讨论】:

      【解决方案2】:

      您尚未指定任何规则。必须这样做,以便 ACL 组件知道谁有权访问什么。这可以通过调用deny() 和/或allow() 来完成。看看the manual,解释的很详细。

      【讨论】:

      • 对不起,我没有附上规则文件。
      【解决方案3】:

      在你的导航文件中你需要添加一个资源标签:

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

      在此示例中,我将资源命名为“admin”,但这将是您在数据库中拥有的管理员资源,管理员用户需要查看/访问该资源的权限。

      【讨论】:

      • 感谢您的回复。但是有了资源,它就不再是动态的了吗?我刚刚了解到,可以使用自己的引导程序设置多个模块。我认为,这是一种更好的方法。大家对此怎么看?
      • 资源不能是动态的 - 例如,您可以将管理控制器命名为管理资源,将索引控制器命名为页面资源,将论坛控制器命名为论坛资源等,然后在您的数据库中分配资源到角色(这将是动态位),因此只有某些角色可以访问某些资源(例如,只有管理员可以访问管理员资源,只有用户可以访问论坛,但每个人都可以访问页面)。我使用模块化排列,并将 module:controller:action 作为资源名称(例如 admin:index:acl)。
      • 嗯,我尝试添加资源。但我收到此错误:在/usr/share/php/libzend-framework-php/Zend/Acl.php 中找不到“资源'Admin'”。
      • 对不起。我认为管理员是角色。我把所有的管理词都改成了cms。也在资源中。我仍然看不到菜单。嗯..
      • 编辑:我有点远!主导航正常工作!我没有在主导航中正确设置资源。现在是 cms 部分...
      【解决方案4】:

      好的,我在我的规则文件中编辑了这条规则:

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

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

      所以我在包含索引的操作中附加了一个数组。 这意味着它正在工作。但是当我只想允许某个操作时,它总是会显示索引页面。

      我发现这当然是合乎逻辑的,因为顶部菜单项仅由整个控制器或索引操作触发。

      为此,您必须将此代码附加到顶部菜单项:

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

      一个解决方案是一个自定义菜单插件,它仅在允许控制器内的索引或其他操作时触发顶部菜单项。

      或者也许有人知道,如何为顶部菜单项设置多个权限? 像这样?:

      <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>
      

      因此,当权限为 OR index、OR biedt、OR Zorg -> 显示此顶部菜单项。

      我犯的另一个错误是打字

      &lt;privileges&gt; 而不是&lt;privilege&gt;

      感谢您的帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 2010-12-17
        相关资源
        最近更新 更多