2013-02-01 1 views
5

Symfony2를 사용하여 웹 응용 프로그램을 만들고 있습니다. 나는 ACL 모듈을 구현하고 있었지만 완벽하게 작동했지만 권한을 관리하기 위해 패널을 만들려고 할 때 문제가 발생했습니다.Symfony2에서 현재 로그인 한 사용자가 아닌 다른 사용자의 ACL을 가져 오는 중입니까?

그래서 나는 프로젝트를 만들고 그의 프로젝트에 "참가자"를 추가 할 수있는 사용자를 확보했습니다. 참가자는 마스크 제작자 MASK_VIEW, MASK_EDIT, MASK_OPERATOR의 마스크 인 세 가지 액세스 유형을 가질 수 있습니다. ProblematicAclManagerBundle 사용하여 우리는 쉽게이이 일을 사용하여 액세스를 추가 할 수 있습니다

$this->aclManager->addObjectPermission($project, $mask, $user); 

것은이 프로젝트를 편집 할 때, 당신은 자신의 현재 액세스 권한을 가진 사용자를 나열 할 수 있어야한다는 것입니다. isGranted 함수를 사용하면 현재 로그인 한 사용자에 대한 사용자 권한을 얻을 수 있지만 다른 사용자에게는 권한이 없습니다. 세 개의 인수가있는 addXXXX 함수와 비교할 때 isGranted에는 보안 개체와 마스크가 두 개만 있습니다. 따라서이 기능을 사용하는 다른 사용자의 권한을 찾을 수 없습니다.


다른 사용자의 권리를 얻는 방법이 있습니까? 또는 acl 테이블에서 데이터를 추출하기 위해 자체 SQL 쿼리를 작성해야합니까?

답변

1

내가 지금 무엇을 가지고 ... 나는 중첩 된 선택과 원시 SQL 쿼리를했다.

//... 
$objectClass = get_class($object); 
$objectId = $object->getId(); 
$userSecurityIdentity = get_class($user) . '-' . $user->getUsername(); 

$sql = "SELECT `mask` FROM `acl_entries`" . 
     "WHERE `object_identity_id` in (" . 
      "SELECT `id` FROM `acl_object_identities` " . 
      "WHERE `object_identifier` = :objectId AND `class_id` in (" . 
       "SELECT `id` FROM `acl_classes` WHERE `class_type` = :objectClass" . 
      ")" . 
     ")" . 
     "AND `security_identity_id` in (" . 
      "SELECT `id` FROM `acl_security_identities`" . 
      "WHERE `identifier` = :userSecurityIdentity" . 
     ");"; 

$query = $this->entityManager->getConnection()->executeQuery($sql, array(
    'objectId'    => $objectId, 
    'objectClass'   => $objectClass, 
    'userSecurityIdentity' => $userSecurityIdentity) 
); 

$data = $query->fetch(); 
$mask = $data['mask']; 
// ... 

이 솔루션은 작동하지만, 실제로 직접 테이블을 쿼리 대신 ACL 모듈을 사용하여 내가 뭔가를 발견하면, 나는 업데이트 것이기 때문에 나에게 가장 좋은 일을하지 않습니다.

1

아마 다른 사용자에 연결된 보안 컨텍스트에서 다른 토큰을 넣어 시도 할 수 있습니다 :

다음
$securityContext->setToken(new Token($user2)); 
$securityContext->isGranted('test', $object); 
+0

것은 내가 TokenInterface을 확장하는 새 토큰을 만들어야 할 것입니다. 그런 다음 사용자를 인증 된 것으로 조롱합니다. 조금 해키지만 작동 할 것입니다 –

0

Symfony\Component\Security\Acl\Model\AclInterface이 방법을 제공한다 : 그와

/** 
* Determines whether access is granted 
* 
* @throws NoAceFoundException when no ACE was applicable for this request 
* @param array $masks 
* @param array $securityIdentities 
* @param Boolean $administrativeMode 
* @return Boolean 
*/ 
public function isGranted(array $masks, array $securityIdentities, $administrativeMode = false); 
+1

물건은 어디에 두는 것입니다. 행을 삽입하면'($ mask, $ object, $ user)'를 수행합니다. 이것은'$ object' 또는'$ user' 여부에 대한 인자를 제공하지 않는 것 같습니다. –

+0

구현 된 객체/클래스에서'identity'가'mask '를 가지고 있는지 확인하는 것 같습니다 –