【问题标题】:Zend Framework 2 - BjyAuthorize always denies accessZend Framework 2 - BjyAuthorize 总是拒绝访问
【发布时间】:2013-03-11 16:28:09
【问题描述】:

我已经设置了bjyoungblood/bjy-authorize 模块,但我目前收到403“拒绝访问”错误,除了在home 路由中配置的那个。

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

【问题讨论】:

  • 是否设置了默认角色guest
  • 是的。在配置和数据库中(手动)
  • 嗯,这样的错误可能很深。这是我的工作配置,但我没有保护路由或控制器:github.com/manuakasam/DuitMarketplace/blob/master/config/… 控制器 indexApplication\Controller\Index 肯定是不同的?

标签: zend-framework2 bjyauthorize


【解决方案1】:

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

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

一旦你删除了路由或控制器守卫的配置,你可以:

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

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

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

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

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

【讨论】:

  • 谢谢两位!我在控制器的路径上犯了一个错误……太愚蠢了! afaik 直到现在这一切似乎都奏效了!
  • @Ron 即使您的错误是拼写错误,我已经编辑了问题,使其不会过于本地化(否则它将被关闭)。我希望这对其他人也有用:)
  • @Ocramius 有没有办法让我的 api 模块绕过 bjyauthorize 提供的授权,因为我的 api 模块有自己的授权过程?
  • 小心其他模块覆盖配置。在我的情况下,zfcadmin 设置了 bjyauthorise 配置,这导致了 ROUTE Guard 与 CONTROLLER 保护的问题。即检查所有配置文件以进行 BJY 集成和自动配置
【解决方案2】:

'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(用于登录!)和错误(否则很难调试)的权限非常重要。

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

【讨论】:

    【解决方案3】:

    我遇到了完全相同的问题。

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

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

    您希望这样添加控制器:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-04-23
        • 1970-01-01
        • 2019-09-26
        • 1970-01-01
        • 2015-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多