2014-04-10 6 views
2

zf2부터 시작하여 많은 권한/역할을 처리해야합니다. ZfcRbac을 사용하십시오. ZF2 zfcrbac zfcUser 및 계층 적 역할 전략을 사용하여 탐색 생성

그래서 난 사용자/계층 적 역할 (테이블 이름 = 역할)/권한

와 매핑을 그리고 난 정책을 거부 일부 경비를합니다.

내 가드, 매핑, 데이터베이스가 괜찮습니다.

내 HierarchicalRole 엔티티는 다음과 같습니다

class HierarchicalRole implements HierarchicalRoleInterface 

그리고 지금은, Bakura에 의해 주어진 원본과 동일합니다.

내 사용자 엔티티는 다음과 같습니다

class User extends ZfcUserEntity implements IdentityInterface 

/** 
* @var \Doctrine\Common\Collections\Collection 
* @ORM\ManyToMany(targetEntity="HierarchicalRole") 
* @ORM\JoinTable(
*  name="user_role_linker", 
*  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="idUser")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")} 
*) 
*/ 
protected $roles; 

및 역할에 의해 생성자에 내장되어 있습니다

로 :

function __construct() { 
    $this->roles = new ArrayCollection(); 
} 

젠드 developper 도구로 난 것을 볼 수 있습니다 ZfcRbac\Collector\RbacCollector 내가 실제로 로그인 한 사용자 (권한, 하위, 주요 역할 등)에 대한 모든 것을 보여줍니다. .

내 질문 : 액세스 권한이있는 링크 만 볼 수있는 사용자를 위해 동적 탐색을 생성하는 방법은 무엇입니까?. 또한 사용자가 로그인하지 않았을 때 연결을 확인하고 로그인 할 때 숨길 수 있습니다 ...

저는 아직 초보자입니다. 그러나 가능하면이 기능을 사용하여 좋은 동적 탐색을 수행 할 수있는 좋은 예제를 얻는 것이 좋습니다. 기준 치수. Spiffy navigation 을 아직 완벽하게 작동하지 않는 : 당신은 여기에서 찾을 수

편집 (5 월 28) 지금까지 내가 항상 해결책을 찾고, 내 시도는 .. 나에게 도움을 아직하지 않았다.

답변

2

ZfcRbac이 (ZF2) Zend/Navigation에서 어떻게 작동하는지 보여 드리겠습니다. 데이터베이스에서 사용 권한에 대한 정의가 있으므로이 섹션을 생략합니다.

탐색 페이지 및 권한 추가 정의 :

설정/global.phpPHP :

return array(
     'navigation' => array(
      'default' => array(
       array(
        'label' => 'Contracts', 
        'route' => 'contract', 
        'action' => 'list', 
        'permission' => 'contract.list', 
        'pages' => array(
         array(
          'label' => 'New contract', 
          'route' => 'contract', 
          'action' => 'add', 
          'permission' => 'contract.add', 
         ) 
        ) 
       ) 
      ) 
     ), 
     'service_manager' => array(
      'factories' => array(
       'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory', 
      ) 
     ) 
    ); 

는 수신기 만들기 (/module/Application/src/Application/Authorization/RbacListener.php) :

<?php 

namespace Application\Authorization; 

use Zend\EventManager\EventInterface; 
use Zend\Navigation\Page\AbstractPage; 
use ZfcRbac\Service\AuthorizationServiceInterface; 

class RbacListener 
{ 
    /** 
    * @var AuthorizationServiceInterface 
    */ 
    protected $authorizationService; 

    /** 
    * @param AuthorizationServiceInterface $authorizationService 
    */ 
    public function __construct(AuthorizationServiceInterface $authorizationService) 
    { 
     $this->authorizationService = $authorizationService; 
    } 

    /** 
    * @param EventInterface $event 
    * @return bool|void 
    */ 
    public function accept(EventInterface $event) 
    { 
     $page = $event->getParam('page'); 

     if (!$page instanceof AbstractPage) { 
      return; 
     } 

     $permission = $page->getPermission(); 

     if (is_null($permission)) { 
      $event->stopPropagation(); 
      return false; 
     } 

     $event->stopPropagation(); 

     return $this->authorizationService->isGranted($permission); 
    } 
} 

RbacListener위한 공장 (/module/Application/src/Application/Factory/RbacListenerFactory.php) 만들기 :

,
<?php 

namespace Application\Factory; 

use Application\Authorization\RbacListener; 
use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

class RbacListenerFactory implements FactoryInterface 
{ 
    /** 
    * {@inheritDoc} 
    */ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $authorizationService = $serviceLocator->get('ZfcRbac\Service\AuthorizationService'); 

     return new RbacListener($authorizationService); 
    } 
} 

ServiceManager (/module/Application/config/module.config)에 RbacListenerFactory를 추가하십시오.PHP) :

<?php 

return array(
    'service_manager' => array(
     'factories' => array(
      'Application\Authorization\RbacListener' => 'Application\Factory\RbacListenerFactory', 
     ), 
    ), 
); 

가 젠드 탐색보기 도우미의 isAllowed 방법에 이벤트를 연결합니다 (그리고 마지막으로 젠드 탐색보기 도우미의 isAllowed 방법)에 이벤트를 첨부 :

<?php 

public function onBootstrap(MvcEvent $event) 
{ 
    $application  = $event->getApplication(); 
    $eventManager  = $application->getEventManager(); 
    $sharedEventManager = $eventManager->getSharedManager; 
    $serviceManager  = $application->getServiceManager(); 
    $rbacListener  = $serviceManager->get('Application\Authorization\RbacListener'); 

    $sharedEventManager->attach(
     'Zend\View\Helper\Navigation\AbstractHelper', 
     'isAllowed', 
     array($rbacListener, 'accept') 
    ); 
} 

하는 렌더링하려면 보기 또는 레이아웃의 메뉴 :

<?php echo $this->navigation('navigation')->menu(); ?> 

나는이 코드를 사용하고 있으며 아주 잘 작동합니다.

: 그것은을 기반으로