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;
}
現在、ユーザーとして、会社に関連付けられているユーザーのみを変更できますが (予想どおり)
、リストにはすべてのユーザーが表示されます。
trutrucとmachinは同じ会社なので編集できます。でも、シュシュエット&トリュックは出さないでほしい。投票者に加えて、管理クラスのメソッドをオーバーライドする必要がありますか?createQuery()
最後に問題は、ACL を使用して sonata ユーザーをフィルタリングする方法です。