5

我正在使用 Symfony2 构建一个 Web 应用程序。我一直在实现 ACL 模块,它运行良好,但在尝试制作面板来管理权限时偶然发现了一个问题。

所以我作为用户可以创建一个项目并在他的项目中添加“参与者”。参与者可以具有三种不同的访问类型,它们是来自掩码生成器的MASK_VIEW掩码MASK_EDIT、、、MASK_OPERATOR。使用ProblematicAclManagerBundle我们可以通过这样做轻松地添加对这些的访问:

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

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


有没有办法获得其他用户的内置权限?还是我必须构建自己的 SQL 查询来从 acl 表中提取数据?

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 回答