Security Symfony角色层次结构
目前,我正在基于遗留数据库构建一个应用程序。 在该数据库中有用户类,例如: UserclassEntity:Security Symfony角色层次结构,security,symfony,Security,Symfony,目前,我正在基于遗留数据库构建一个应用程序。 在该数据库中有用户类,例如: UserclassEntity: 身份证 类名 母公司 用户类实体 因此,我重写了核心服务,并将我的自定义投票者添加到security中。投票者: security.role_hierarchy: class: AppBundle\Security\Role\RoleHierarchy arguments: - '%security.role_hierarchy.roles%' - '@a
- 身份证
- 类名
- 母公司
- 用户类实体
security.role_hierarchy:
class: AppBundle\Security\Role\RoleHierarchy
arguments:
- '%security.role_hierarchy.roles%'
- '@app.user_class_repository'
security.access.admin_voter:
class: AppBundle\Security\Voter\AdminVoter
arguments: ['@security.role_hierarchy']
tags:
- { name: security.voter, priority: 400 }
public: false
因此,我基于原始RoleHierarch类实现了所有需要的方法:
class RoleHierarchy extends orig_RoleHierarchy
{
/**
* @var array
*/
private $hierarchy;
/**
* @var UserclassRepository
*/
private $userClassRepository;
/**
* @var RoleManager
*/
private $manager;
/**
* @var UserclassRepository
*/
private $userclassRepository;
/**
* @param UserclassRepository $userclassRepository
* @param array $hierarchy
*/
public function __construct(UserclassRepository $userclassRepository, array $hierarchy)
{
$this->hierarchy = $hierarchy;
$this->userclassRepository = $userclassRepository;
$map = $this->buildRolesTree($this->hierarchy);
parent::__construct($map);
}
/**
* Here we build an array with roles. It looks like a two-levelled tree - just
* like original Symfony roles are stored in security.yml
*
* @param array $hierarchy
*
* @return array
*/
private function buildRolesTree(array $hierarchy = [])
{
$userclasses = $this->userclassRepository->findAll();
foreach ($userclasses as $userclass) {
/** @var $userclass Userclass */
if ($userclass->getParent()) {
if (!isset($hierarchy['ROLE_' . $userclass->getName()])) {
$hierarchy['ROLE_' . $userclass->getName()] = array();
}
$hierarchy['ROLE_' . $userclass->getName()][] = 'ROLE_' . $userclass->getParent()->getName();
} else {
if (!isset($hierarchy['ROLE_' . $userclass->getName()])) {
$hierarchy['ROLE_' . $userclass->getName()] = array();
}
}
}
return $hierarchy;
}
}
但当我清除prod环境的缓存时,我得到一个错误:
[Symfony\Component\Debug\Exception\FatalErrorException]
Compile Error: require(): Failed opening required 'E:\projects\sf2\app\var\cache\pro_/doctrine/orm/Proxies\__CG__AppBundleEntityUserclass.php' (include_path='.;C:\php\pear')
这个异常抛出是因为缺少代理类,但我真的不知道如何用另一种方式来实现。我需要这个实体,我需要基于这个实体的角色层次结构
关于如何解决这个问题有什么建议吗
如建议的,还有一些文件:
doctrine是config.yml的一部分
doctrine:
dbal:
driver: pdo_mysql
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: LATIN1
mapping_types:
enum: string
orm:
auto_generate_proxy_classes: "%kernel.debug%"
entity_managers:
default:
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
dql:
string_functions:
COLLATE: AppBundle\DQL\CollateFunction
条令ORM:
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="AppBundle\Entity\Userclass" table="userclass" repository-class="AppBundle\Repository\UserclassRepository">
<indexes>
<index name="name" columns="name,classname,class,color"/>
</indexes>
<id name="id" type="integer" column="id">
<generator strategy="AUTO"/>
</id>
<field name="name" type="string" column="name" length="50" nullable="false">
<options>
<option name="fixed"/>
</options>
</field>
<field name="classname" type="string" column="classname" length="50" nullable="false">
<options>
<option name="fixed"/>
</options>
</field>
<field name="class" type="integer" column="class" nullable="false">
<options>
<option name="unsigned"/>
</options>
</field>
<field name="color" type="string" column="color" length="10" nullable="false">
<options>
<option name="fixed"/>
</options>
</field>
<many-to-one field="parent" target-entity="AppBundle\Entity\Userclass">
<join-column name="parent_id" referenced-column-name="id" />
</many-to-one>
</entity>
</doctrine-mapping>
我做了很多尝试,但都没有奏效。正如我发现的,doctrine:orm中的代理生成任务在与Symfony 3.1.x兼容的最新版本中被删除 如果有人陷入这种困境,最好的办法(我能找到)就是设置 自动生成从“%kernel.debug%”到true的代理类 非常简单,只有在开发环境中,这个参数才是真的。在生产模式下运行应用程序,会明显地将此设置为false,因此不会按需要生成ProxyClass。在条令获得生成所需代理的机会之前,角色层次结构以某种方式被触发 通过启用此自动生成选项,这些代理将根据需要生成,并缓存。因此,任何最小的性能中断只会发生一次。生成后,这些类也被缓存
在我的应用程序中,我找不到任何相关的或甚至很小的性能问题。尝试手动清除缓存(通过删除
缓存
目录中的所有文件夹)并执行缓存:清除
之后,我的windows开发机器上经常出现这种错误。还要检查Userclass
实体名和文件名,它们必须相同。我已经尝试过这个,也尝试过运行cache:clear with--no warmup选项。在尝试访问前端的应用程序时,这会导致相同的错误。您能否从config.yml发布您的Userclass的ORM配置以及您的条令部分?另外,我认为与此问题无关,security.role_层次结构参数的配置是错误的(首先应该是存储库服务,然后是角色参数)。
orm:
auto_generate_proxy_classes: "%kernel.debug%"