5

Symfony2を使用してWebアプリケーションを構築しています。私はACLモジュールを実装していて、それは完全に機能しましたが、権利を管理するためのパネルを作成しようとしたときに問題に遭遇しました。

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

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

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


組み込みの他のユーザーの権限を取得するための何らかの方法はありますか?または、aclテーブルからデータを抽出するために独自のSQLクエリを作成する必要がありますか?

4

3 に答える 3

1

たぶん、別のユーザーにリンクされた別のトークンをセキュリティコンテキストに配置しようとすることができます。

$securityContext->setToken(new Token($user2));
$securityContext->isGranted('test', $object);
于 2013-02-01T16:05:42.780 に答える
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 モジュールを使用する代わりに実際にテーブルを直接クエリするため、私にとっては最善の方法ではありません。何か他のものを見つけたら更新します。

于 2013-02-01T20:33:46.307 に答える
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);
于 2013-04-03T15:08:22.227 に答える