9

我已经设置了bjyoungblood/bjy-authorize模块,但目前403每个 URL 都出现“访问被拒绝”错误,除了home路由中配置的 URL。

我的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 似乎都可以工作。如何调试此行为?

4

4 回答 4

11

注意:以下对BjyAuthorize有效1.2.*

首先,考虑保护路由和控制器是不必要的。我个人总是只保护控制器,因为可能有多个路由到同一个控制器。

删除路由或控制器保护的配置后,您可以:

  • 安装Zend Developer Tools,它可以让您对当前设置的Acl 角色有一个概览,如下图所示:

    在此处输入图像描述

  • 检查您是否配置了正确的身份提供者:默认使用ZfcUseruser_role的用户 id 并在表中查找他的角色。

  • 检查该guest角色是否有权访问公共页面,例如zfcuser控制器(用于登录操作)或zfcuser/login路由。

正如 Akrabat 指出的那样, 和 的配置BjyAuthorize\Guard\ControllerBjyAuthorize\Guard\Route名单,这基本上意味着guest如果您想浏览未经身份验证的页面,则必须为默认角色设置访问权限。

一旦配置了警卫,它就会阻止对任何未配置资源的访问,因此请确保您已授予该角色guest(或您在$config['bjyauthorize']['default_role']访问中配置的任何内容,至少可以访问登录控制器或路由。

于 2013-03-12T09:30:03.807 回答
5

'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(用于登录!)和错误(否则很难调试东西)。

我没有尝试同时使用控制器和路由保护。

于 2013-03-12T08:41:02.910 回答
1

我有完全相同的问题。

我认为问题在于 BjyAuthorize 没有很好的文档记录,所以我们中的许多人只是简单地复制和粘贴并从提供的文件中进行处理。例如从以下:

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

您希望这样添加控制器:

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

但是,您需要添加完整路径,否则它将不起作用:

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

我希望这可以节省一些人的工作时间,因为我完全被这个弄糊涂了!

于 2014-04-24T19:15:26.863 回答
0

通过这个在 module.php 中调试你的代码

public function onBootstrap($e)
    {   echo "<pre>";
        var_dump($e->getTarget()->getServiceManager()->get('BjyAuthorize\Provider\Identity\ProviderInterface'));
    }
于 2015-05-03T09:36:05.503 回答