获取除Symfony2中当前登录用户之外的其他用户的ACL?

时间:2013-02-01 14:07:55

标签: symfony acl symfony-2.1

我正在使用Symfony2构建Web应用程序。我一直在实施ACL模块,它工作得很好,但在尝试制作一个管理权限的平台时偶然发现了一个问题。

所以我得到了一个用户,可以创建一个项目并在他的项目中添加“参与者”。参与者可以有三种不同的访问类型,即掩码构建器MASK_VIEWMASK_EDITMASK_OPERATOR中的掩码。使用ProblematicAclManagerBundle,我们可以使用以下方法轻松添加对这些内容的访问权限:

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

问题是,当您想要编辑项目时,您必须能够列出具有当前访问权限的用户。函数isGranted可以让您为当前登录用户提供权限,但不能为其他用户提供权限。与有{3}个参数的addXXXX函数相比, isGranted 只有两个,即安全对象和掩码。因此,您无法找到具有此功能的其他用户的权利。


是否有某种方法可以获得其他用户内置的权利?或者我是否必须构建自己的SQL查询以从acl表中提取数据?

3 个答案:

答案 0 :(得分:1)

也许您可以尝试在安全上下文中添加另一个令牌,链接到另一个用户:

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

答案 1 :(得分: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模块,如果我找到别的东西,我会更新。

答案 2 :(得分: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);