vendor/rawafed/security-bundle/Loader/UserRolesHierarchyLoader.php line 26

Open in your IDE?
  1. <?php
  2. namespace Rawafed\SecurityBundle\Loader;
  3. use Symfony\Component\DependencyInjection\ContainerInterface;
  4. use Symfony\Component\Security\Core\Role\RoleHierarchy;
  5. use Symfony\Component\Config\ConfigCache;
  6. use Symfony\Component\Yaml\Parser;
  7. use Symfony\Component\Yaml\Dumper;
  8. use Symfony\Component\Yaml\Exception\ParseException;
  9. class UserRolesHierarchyLoader extends RoleHierarchy
  10. {
  11.     /**
  12.      * @var ContainerInterface
  13.      */
  14.     private $container;
  15.     private $isDebugMode;
  16.     private $cacheFilePath;
  17.     /**
  18.      * @param array $hierarchy
  19.      */
  20.     public function __construct(array $hierarchyContainerInterface $container$cacheDir,  $isDebugMode true )
  21.     {
  22.         $this->container $container;
  23.         $this->isDebugMode = (bool) $isDebugMode;
  24.         $this->cacheFilePath $cacheDir// . DIRECTORY_SEPARATOR . "roles_hierarchy.cache.yml";
  25.         
  26.         // merging recursivly the default array of roles hierarchy in #app/config/security.yml with the roles hierarchy exists in roles database table
  27.         $hierarchy array_merge_recursive ($hierarchy$this->buildRolesTree());
  28.         parent::__construct$hierarchy );
  29.     }
  30.     /**
  31.      * Here we build an array with roles. It looks like a two-levelled tree from table roles in database - just
  32.      * like original Symfony roles are stored in security.yml
  33.      * @return array
  34.      */
  35.     private function buildRolesTree()
  36.     {
  37.         $hierarchy = array();
  38.         // to avoid database error in cli mode
  39.         if ( php_sapi_name() === 'cli' )
  40.             return $hierarchy;
  41. /*
  42.         $pathInfo = $this->container->get("request_stack")->getCurrentRequest()->getPathInfo();
  43.         dump($pathInfo );
  44.         die();
  45. */
  46.         /**
  47.          * checking if is admin area.
  48.          * $isAdmin is true if in admin area.
  49.          * if is admin it will load all role hierarchy or only one or two levels will be loaded
  50.          *
  51.          */
  52.         $request $this->container->get("request_stack")->getMasterRequest();
  53.         if(!$request) {
  54.             return array();
  55.         }
  56.         $pathInfo $request->getPathInfo();
  57.         $adminPrefix $this->container->getParameter("app.secured_area.route_prefix");
  58.         $isAdmin false;
  59.         // preparing the app.secured_area.route_prefix to replace any url parameter as {_locale} to be (.*) as /{_locale}/admin to be /(.*)/admin
  60.         // preg_quote($adminPrefix) to escape $adminPrefix to be looks like /\{_locale\}\/admin
  61.         $adminPrefix preg_replace("/{[^}]+}/""(.*)"preg_replace( array('/\\\{/''/\}/'), array('{''}'), preg_quote($adminPrefix'/')));
  62.         if(preg_match("/^($adminPrefix)/i"$pathInfo)){
  63.             $isAdmin true;
  64.             $this->cacheFilePath .= DIRECTORY_SEPARATOR "rawafed_security_bundle" DIRECTORY_SEPARATOR base64_encode($adminPrefix);
  65.         }else{
  66.             $this->cacheFilePath .= DIRECTORY_SEPARATOR "rawafed_security_bundle" DIRECTORY_SEPARATOR "not_secured";
  67.         }
  68.         $this->cacheFilePath .= ".roles_hierarchy.cache.yml";
  69.         $em $this->container->get('doctrine.orm.entity_manager');
  70.         $cacheFile = new ConfigCache$this->cacheFilePath$this->isDebugMode );
  71.         if($cacheFile->isFresh()) {
  72.             $yamlParser = new Parser();
  73.             $cacheFileContent file_get_contents($this->cacheFilePath);
  74.             try {
  75.                 $hierarchy $yamlParser->parse($cacheFileContent);
  76.                 return $hierarchy;
  77.             } catch (ParseException $e) {
  78.             }
  79.         }
  80.         /**
  81.          * if isAdmin will select all roles levels or it will load only two levels.
  82.          * there is no roles levels in manual roles
  83.          */
  84.         $roles $em->createQuery('SELECT r FROM RawafedSecurityBundle:Role r ' . ($isAdmin === false "WHERE r.lvl IN (0, 1) AND r.role NOT LIKE 'ROLE_ADMIN_%'" "" ) . ' ORDER BY r.root, r.lft')->execute();
  85.         foreach($roles as $role) {
  86.             $roleName $role->getRole();
  87.             if($role->getParent()) {
  88.                 $parentRoleName $role->getParent()->getRole();
  89.                 if(!isset($hierarchy[$parentRoleName])) {
  90.                     $hierarchy[$parentRoleName] = [];
  91.                 }
  92.                 $hierarchy[$parentRoleName][] = $roleName;
  93.             }
  94.             if(!isset($hierarchy[$roleName]) && (strpos($roleName'ROLE_ADMIN_') === FALSE) && ($roleName != 'ROLE_SUPER_ADMIN')) {
  95.                 $hierarchy[$roleName] = array($roleName);
  96.             }
  97.         }
  98.         $dumper = new Dumper();
  99.         $rolesHierarchy $dumper->dump($hierarchy10);
  100.         $cacheFile->write($rolesHierarchy);
  101.         return $hierarchy;
  102.     }
  103. }