2012-08-28 1 views
5

일부 ACL 권한이 필요한 Symfony2 응용 프로그램을 사용 중입니다.symfony2 여러 사용자가 여러 객체에 ACL을 액세스

저는 Symfony2를 처음 사용하는 초보자입니다. 올바른 방법을 찾고 있는지 확실하지 않습니다.

나는 다수의 고객이 있으며 각각은 여러 계정을 가지고 있습니다.

모든 클라이언트와 모든 계정에 액세스 할 수있는 최고 관리자 (ROLE_SUPER_ADMIN)가 있습니다. 그런 다음 특정 클라이언트 및 해당 클라이언트의 모든 계정에 대한 액세스 만 허용되는 관리 역할 (ROLE_ADMIN)이 있습니다. 그런 다음 에이전트 (ROLE_AGENT)가 있습니다. 에이전트에는 클라이언트에 대한 특정 계정에 대한 권한 만 있어야합니다.

나는 다음과 같은 코드를 사용하여 특정 개체에 대한 사용자 액세스 권한을 부여 할 수있는 심포니 문서에서 본 : 새 계정을 만들 때, 내가 줄 수있는 그래서

// creating the ACL 
$aclProvider = $this->get('security.acl.provider'); 
$objectIdentity = ObjectIdentity::fromDomainObject($account); 
$acl = $aclProvider->createAcl($objectIdentity); 

// retrieving the security identity of the currently logged-in user 
$securityContext = $this->get('security.context'); 
$user = $securityContext->getToken()->getUser(); 
$securityIdentity = UserSecurityIdentity::fromAccount($user); 

// grant owner access  
$acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER); 
$aclProvider->updateAcl($acl); 

을 현재 로그인 한 새로 생성 된 계정에 대한 사용자 액세스 그러나 계정에 대한 클라이언트 액세스의 다른 모든 사용자에게 어떻게 액세스 권한을 부여합니까?

모든 사용자를 반복하여 모든 사용자에 대해 위 코드를 실행하고 싶지는 않습니다.

예를 들어 모든 클라이언트를 볼 때 사용자가 액세스 할 수있는 클라이언트를 알아야하거나 계정을 볼 때 사용자가 액세스 할 수있는 계정을 알아야합니다.

또한 새 사용자를 클라이언트에 추가 할 때 사용자는 해당 클라이언트의 모든 계정에 자동으로 액세스 할 수 있어야합니다.

부수적으로, 사용자가 계정/클라이언트에 액세스 할 수 있는지를 알아야합니다. 사용자가 액세스 할 수 있으면 자동으로보기/편집/삭제할 수 있습니다.

+2

특정 역할의 모든 사용자에게 권한을 할당해야하는 경우 대신 역할 기반 'ACL'을 사용해야합니다. 이는 거의 모든 계정 기반입니다. 다음 몇 시간 안에 몇 가지 예제 코드를 작성할 수 있어야합니다. 그러나 역할이 무언가가 아니라면 ** ** 권한을 할당하려는 각 사용자를 반복해야합니다 **. –

답변

0

이 경우 필자는 엔티티 간의 ManyToMany 관계를 확인하는 사용자 지정 보안 서비스를 사용했습니다. 그것은 이상적인 결정이 아니라 명심하십시오.

먼저 모든 컨트롤러 동작에서 트리거되는 수신기를 만들어야합니다.

class SecurityListener 
{ 
    protected $appSecurity; 

    function __construct(AppSecurity $appSecurity) 
    { 
     $this->appSecurity = $appSecurity; 
    } 

    public function onKernelController(FilterControllerEvent $event) 
    { 
     $c = $event->getController(); 

     /* 
     * $controller passed can be either a class or a Closure. This is not usual in Symfony2 but it may happen. 
     * If it is a class, it comes in array format 
     */ 
     if (!is_array($c)) { 
      return; 
     } 

     $hasAccess = $this->appSecurity->hasAccessToContoller($c[0], $c[1], $event->getRequest()); 

     if(!$hasAccess) { 
      throw new AccessDeniedHttpException('Access denied.'); 
     } 

    } 
} 

서비스에서는 요청, 컨트롤러 인스턴스 및 작업 호출에 대한 액세스 권한이 있습니다. 그래서 우리는 결정을 사용자 액세스 권한으로 만들 수 있습니다. 당신이 ParamConverter 같은 매우 불쾌한 주석을 사용하는 경우

class AppSecurity 
{ 
    protected $em; 
    protected $security; 
    /** @var $user User */ 
    protected $user; 

    public function __construct(EntityManager $em, SecurityContext $security) 
    { 
     $this->em = $em; 
     $this->security = $security; 

     if($security->getToken() !== null && !$security->getToken() instanceof AnonymousToken) { 
      $this->user = $security->getToken()->getUser(); 
     } 
    } 

    /** 
    * @param $controller 
    * @param string $action 
    */ 
    public function hasAccessToContoller($controller, $action, Request $request) 
    { 
     $attrs = $request->attributes->all(); 
     $client = $attrs['client']; 

     /* db query to check link between logged user and request client */ 
    } 
} 

쉽게 요청에서 entites를 사용할 준비 추출 할 수 있습니다.