Zend framework2 ZF2-BjyAuthorize-如何从数据库获取规则和保护
我正在使用BjyAuthorize和Zend Framework2来实现授权,并且能够成功地集成数据库中的角色。现在我还想从数据库表中获取规则和保护。我怎样才能做到这一点?基本上,您必须编写自己的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界面 这样,您就可以编写自己的类来实现接口,然后通过
提供程序
看看不同的。每个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
)
)