2013-03-11 65 views
9

我已經設置了bjyoungblood/bjy-authorize模塊,但是我目前每個URL都得到403「訪問被拒絕」錯誤,除了在home路由中配置的錯誤。Zend Framework 2 - BjyAuthorize總是拒絕訪問

module.byjauthorize.global.php看起來像以下:

'bjyauthorize' => array(
    'guards' => array(
     'BjyAuthorize\Guard\Controller' => array(
      array('controller' => 'index', 'action' => 'index', 'roles' => array('guest','user')), 
      array('controller' => 'index', 'action' => 'stuff', 'roles' => array('user')), 
      array('controller' => 'zfcuser', 'roles' => array()), 
      //backend 
      array('controller' => 'Application\Controller\Index', 'roles' => array('admin')), 
      array('controller' => 'MyModule\MyEntity\MyEntity', 'roles' => array('admin')), 

     ), 

     'BjyAuthorize\Guard\Route' => array(
      array('route' => 'zfcuser', 'roles' => array('user')), 
      array('route' => 'zfcuser/logout', 'roles' => array('user')), 
      array('route' => 'zfcuser/login', 'roles' => array('guest')), 
      array('route' => 'zfcuser/register', 'roles' => array('guest')),     
      array('route' => 'home', 'roles' => array('admin')), 
      array('route' => 'my-entity', 'roles' => array('admin')), 
     ), 
    ), 
), 

我試圖刪除BjyAuthorize\Guard\Route部分,但沒有效果。 當我刪除home路線時,主頁也被阻止。因此,Controller和Route-Guard似乎都可以工作。 如何調試此行爲?

+1

是默認角色'guest'設置? – Sam 2013-03-11 16:45:23

+0

是的。在配置和數據庫中(手動) – Ron 2013-03-11 16:46:18

+0

嗯,這樣的錯誤可能會很深。這是我的一個工作配置,但我不守護路線或控制器:https://github.com/manuakasam/DuitMarketplace/blob/master/config/module.config.php#L92控制器索引和應用程序\ Controller \ Index'確實是不同的? – Sam 2013-03-11 17:04:31

回答

10

:以下適用於BjyAuthorize 1.2.*

首先,考慮到同時保護線路和控制器是不必要的。我個人總是保護控制器,因爲可能有多個路由到同一個控制器。

一旦你刪除任何路線或控制器後衛的配置,您可以:

  • 安裝Zend Developer Tools,它可以讓你有當前設置的Acl role的概述,像這樣的畫面:

    enter image description here

  • 檢查您是否配置了正確的身份提供者:默認的使用ZfcUser的用戶ID並在0123中查找他的角色表。

  • 檢查guest角色是否有權訪問公共頁面,如zfcuser控制器(用於登錄操作)或zfcuser/login路由。

由於Akrabat指出,對於BjyAuthorize\Guard\ControllerBjyAuthorize\Guard\Route配置是whitelists,這基本上意味着,如果你想瀏覽的頁面是沒有認證的,你必須爲默認guest角色設置訪問權限。

只要配置了防護,它就會阻止訪問任何未配置的資源,因此請確保您已授予角色guest(或您在$config['bjyauthorize']['default_role']中配置的任何至少登錄控制器或路由。

+0

謝謝你們兩位!我對控制器的路徑犯了一個錯誤......真是愚蠢!直到現在,afaik似乎都可以工作! – Ron 2013-03-12 09:33:27

+1

@Ron即使你的錯誤是一個錯字,我已經編輯了這個問題,以便它不是太本地化(否則它將被關閉)。我希望這對其他人也有用:) – Ocramius 2013-03-12 09:39:57

+0

謝謝,我也希望如此:) – Ron 2013-03-12 09:41:13

4

只要在'BjyAuthorize\Guard\Controller'陣列中創建一個條目,就需要爲每個具有適當權限的控制器創建條目。

我有這樣的:(!用於登錄)

'BjyAuthorize\Guard\Controller' => array(
    // Access for everyone 
    array('controller' => 'zfcuser', 'roles' => array('guest')), 
    array('controller' => 'Application\Controller\Index', 'action' => 'index', 'roles' => array('guest')), 
    array('controller' => 'error', 'roles' => array('guest')), 

    // Restricted 
    array('controller' => 'User\Controller\AdminUser', 'roles' => array('admin')), 

), 

你給來賓訪問zfuser是非常重要的和錯誤(很難調試的東西,否則)。

我還沒有嘗試過使用控制器和路由守衛同時。

1

我有完全相同的問題。

我認爲問題在於BjyAuthorize沒有很好的文檔記錄,所以我們很多人都只是從提供的文件中複製粘貼和工作。例如從以下方面:

'BjyAuthorize\Guard\Controller' => array(
      array('controller' => 'zfcuser', 'roles' => array()), 
     ), 

你會希望添加控制器這樣:

array('controller' => 'controllername', 'role' => array()), 

但是你需要添加的完整路徑,否則將無法正常工作:

array('controller' => 'Folder/Controller/Action', 'role' => array()), 

我希望這可以節省一個人幾個小時的工作,因爲我完全被這個弄糊塗了!

0

調試代碼通過這module.php

public function onBootstrap($e) 
    { echo "<pre>"; 
     var_dump($e->getTarget()->getServiceManager()->get('BjyAuthorize\Provider\Identity\ProviderInterface')); 
    }