2013-03-11 77 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')); 
    }