在Sonata用户管理员中,我希望用户能够列出/编辑属于同一公司的用户。
所以我已经实现了一个自定义选民来管理用户管理上的这个特定安全规则:
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;
}
现在,作为用户,我只能修改附加我公司的用户(如预期的那样)
但我仍然看到列表中的所有用户。
trutruc & machin 来自同一家公司,所以我可以编辑它们。但我想 chouchouette & truc 不会出现。除了选民之外,我还必须覆盖管理类“createQuery()
方法吗?
最后问题是:如何使用ACL过滤奏鸣曲用户?
答案 0 :(得分:2)
你不能
至少我没有找到使用ACL和Voters过滤列表的方法
我不得不覆盖管理员的createQuery()
答案 1 :(得分:1)