3

在 Sonata User Admin 中,我想让用户能够仅列出/编辑属于同一公司的用户。

所以我已经实现了一个自定义选民来管理用户管理员上的这个特定安全规则:

public function supportsAttribute($attribute) 
{
   return in_array($attribute, array(
      'EDIT',
      'DELETE',
      'VIEW',
      'LIST',
   ));
}

public function supportsClass($class)
{
    return in_array("FOS\UserBundle\Model\UserInterface"
      , class_implements($class));
}

public function vote(TokenInterface $token, $object, array $attributes) 
{
    if ( !($this->supportsClass(get_class($object))) ) {
        return VoterInterface::ACCESS_ABSTAIN;
    }

    foreach ($attributes as $attribute) {
        if ( !$this->supportsAttribute($attribute) ) {
            return VoterInterface::ACCESS_ABSTAIN;
        }
    }

    $user = $token->getUser();
    if ( !($user instanceof UserInterface) ) {
        return VoterInterface::ACCESS_DENIED;
    }

    // check if the user has the same company
    if ($user->getCompany() == $object->getCompany()) {
        return VoterInterface::ACCESS_GRANTED;
    }

    return VoterInterface::ACCESS_DENIED;
}

现在,作为用户,我只能修改连接我公司的用户(如预期的那样)
,但我仍然可以看到列表中的所有用户。

奏鸣曲用户管理网格

trutrucmachin来自同一家公司,所以我可以编辑它们。但我希望chochouette & truc不出现。createQuery()除了选民之外,我是否必须覆盖管理类的方法?

最后的问题是:如何使用 ACL 过滤奏鸣曲用户?

4

2 回答 2

2

你不能

至少我没有找到使用 ACL 或 Voters 过滤列表的方法。
我不得不覆盖管理员的createQuery()

于 2013-07-05T08:19:52.767 回答
1

还有一个包也可以过滤列表:https ://github.com/coopTilleuls/CoopTilleulsAclSonataAdminExtensionBundle

于 2014-02-18T14:38:28.073 回答