2013-02-01 13 views
5

私はSymfony2を使ってWebアプリケーションを構築しています。私はACLモジュールを実装していましたが、完全に機能しましたが、権利を管理するためにpannelを作成しようとすると問題が発生しました。Symfony2で現在ログインしているユーザー以外のユーザーのACLを取得していますか?

私はプロジェクトを作成し、彼のプロジェクトに「参加者」を加えることができるユーザーを得ました。参加者は、マスクビルダーMASK_VIEWMASK_EDITMASK_OPERATORからのマスクである3つの異なるアクセスタイプを持つことができます。 ProblematicAclManagerBundleを使用すると、我々は簡単にこれをやって使用して、これらへのアクセスを追加することができます。

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

事は、プロジェクトを編集したいとき、あなたは彼らの現在のアクセス権を持つユーザーの一覧を表示できるようにするということです。機能isGrantedは、現在ログインしているユーザーのユーザー権限を取得しますが、他のユーザーは取得できません。引数が3つあるaddXXXX関数と比較して、isGrantedには、保護されたオブジェクトとマスクが2つしかありません。したがって、この機能を持つ別のユーザーの権利を見つけることはできません。


他のユーザーのビルトインの権利を取得する方法はありますか?または、自分のSQLクエリを構築してaclテーブルからデータを抽出する必要がありますか?

答えて

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'を持っているかどうかをチェックするようです –

関連する問題