Zend framework2 ZF2-BjyAuthorize-如何从数据库获取规则和保护

Zend framework2 ZF2-BjyAuthorize-如何从数据库获取规则和保护,zend-framework2,doctrine,zend-db,bjyauthorize,Zend Framework2,Doctrine,Zend Db,Bjyauthorize,我正在使用BjyAuthorize和Zend Framework2来实现授权,并且能够成功地集成数据库中的角色。现在我还想从数据库表中获取规则和保护。我怎样才能做到这一点?基本上,您必须编写自己的提供程序 看看不同的。每个RoleProvider实现Provider\Role\Provider接口。当你想实施守卫和规则时,也必须做同样的事情。您进入特定目录Provider\Rule和Provider\Resource并检查特定的Provider界面 这样,您就可以编写自己的类来实现接口,然后通过

我正在使用BjyAuthorize和Zend Framework2来实现授权,并且能够成功地集成数据库中的角色。现在我还想从数据库表中获取规则和保护。我怎样才能做到这一点?

基本上,您必须编写自己的
提供程序

看看不同的。每个
RoleProvider
实现
Provider\Role\Provider接口
。当你想实施守卫和规则时,也必须做同样的事情。您进入特定目录
Provider\Rule
Provider\Resource
并检查特定的
Provider界面

这样,您就可以编写自己的类来实现接口,然后通过配置告诉BjyAuthorize使用您的提供程序类


就警卫而言,我相信还不可能从数据库中创建这些。您必须修改/PR模块本身才能实现这一点。

最简单的方法和这里的“诀窍”是:

  • 将规则和防护设置为与示例配置中所示相同的数组格式。因此,在从数据库中读取记录后,无论原始数据库数据的格式如何,都要对其进行处理,使其与配置中的保护格式相匹配。(我的回答详细介绍了如何使用Doctrine ORM实现这一点,但也应该让您了解其他数据库引擎。只需用您最喜爱的数据库引擎替换“DB read”操作即可)

  • 从您将要编写的
    模块\u NAME\Factory\DoctrineControllerGuardAdapterFactory
    中,将已经采用BJYAAuthorize期望的正确格式(因为您这样做了)的规则注入
    BJYAAuthorize\Guard\Controller
    。Bjy的控制器会将这些规则视为来自配置*,不会怀疑有任何差异

  • 退后一步,好好享受吧

  • 这是您需要在自己的模块中编写的结构:

    命名您的\u模块\u名称\工厂;
    /**
    *请参阅ZF2配置中的“如何以及在何处准确注册工厂”
    *下面是我的答案。
    */
    类[自定义]控制器GuardAdapterFactory
    {
    公共函数createService(serviceLocator接口$serviceLocator)
    {
    /**
    *从Favorite DB engine(或任何东西)检索规则
    *
    *(您可以使用$serviceLocator获取数据库引擎的配置)
    *(您可以使用$serviceLocator获取数据库引擎)
    *(您可以使用$serviceLocator获取数据库引擎的ORM实体)
    *(或者您可能会以其他方式破坏数据库连接和检索)
    *
    *见鬼,您可以使用PHP的file()方法从文本文件中读取它们
    *并且根本不使用$serviceLocator
    *
    *你可以在这里自己硬编码规则
    */            
    $rules=…//数组(…);
    /** 
    *将它们注入Bjy的控制器
    *
    *规则必须与Bjy配置中的格式相同,否则它会呕吐。
    *查看如何构造['guards'][\BjyAuthorize\Guard\Controller::class]
    *以Bjy配置为例
    */             
    返回新的\BjyAuthorize\Guard\Controller($rules,$serviceLocator);
    }
    }
    
    现在,观察并观察这是多么令人麻木的复杂!(模仿Bjy自己的机制)

    这主要是ZF2,OO&Bjy“配置地狱”,伙计们,没有什么特别的。欢迎来到ZF2、Bjy和ORM配置地狱。不客气

    详细答案-如何实施? 编写一个适配器工厂,它从数据库中读取规则,然后将它们注入数据库。其效果与从
    ['guards'][\BjyAuthorize\Guard\Controller::class]

    什么?

    其工作方式是,它采用特定格式的规则(为
    ['guards']['BjyAuthorize\Guard\Controller']
    指定的格式),然后使用规则填充ACL。它还为您计算规则中的资源,并将这些资源加载到ACL中。如果没有,您将不得不编写自己的资源提供程序来执行此操作

    因此任务变为:

    • 从数据库加载规则,并将规则转换为BjyAuthorize期望的格式。这可以在您自己的规则提供程序中完成
    • 您可以使用工厂从module.config.php文件加载特定的DB和存储类配置数组。我把我的放在
      ['guards']['YOUR\u MODULE\u NAME\u controller\u guard\u adapter']
    'guards'=>数组(
    “您的\u模块\u名称\u控制器\u保护\u适配器”=>阵列(
    'object\u manager'=>'doctrine.entity\u manager.orm\u default',
    “规则\u实体\u类”=>“您的\u模块\u名称\entity\ObjectRepositoryProvider”
    )
    )
    
    • (续)我将其置于与规则提供者相反的保护之下,因为我们在这里处理的不是一个纯粹的规则提供者。它是一个保护提供程序,或“一个从ObjectRepositoryProvider中获取规则并将其注入控制器保护的适配器”,除了加载规则,而不是角色。然后将规则注入控制器,如下一步所示
    实施细节示例(来自评论中的Q/A) 更多关于“将规则注入控制器”的最后一点。基本上有两个步骤:1)确保你已经(或将)以某种方式生成规则(这是困难的一步)。2) 将这些规则注入控制器(这是更简单的步骤)。实际注射是这样做的

    $rules=\uuuuu MAGIC\uuuuu//不知何故,把规则从某个地方弄出来。
    返回新控制器($rules,$serviceLocator)//$规则注入点
    
    请参阅下面的代码块了解我自己的实现,其中
    'service_manager' => array(
        'factories' => array(
            'YOUR_MODULE_NAME_controller_guard_adapter' => \YOUR_MODULE_NAME\Factory\DoctrineControllerGuardAdapterFactory::class
        )
    )