Security Symfony角色层次结构

Security Symfony角色层次结构,security,symfony,Security,Symfony,目前,我正在基于遗留数据库构建一个应用程序。 在该数据库中有用户类,例如: UserclassEntity: 身份证 类名 母公司 用户类实体 因此,我重写了核心服务,并将我的自定义投票者添加到security中。投票者: security.role_hierarchy: class: AppBundle\Security\Role\RoleHierarchy arguments: - '%security.role_hierarchy.roles%' - '@a

目前,我正在基于遗留数据库构建一个应用程序。 在该数据库中有用户类,例如:

UserclassEntity:

  • 身份证
  • 类名
  • 母公司
    • 用户类实体
因此,我重写了核心服务,并将我的自定义投票者添加到security中。投票者:

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%"