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;
}

現在、ユーザーとして、会社に関連付けられているユーザーのみを変更できますが (予想どおり)
、リストにはすべてのユーザーが表示されます。

Sonata ユーザー管理グリッド

trutrucmachinは同じ会社なので編集できます。でも、シュシュエットトリュックは出さないでほしい。投票者に加えて、管理クラスのメソッドをオーバーライドする必要がありますか?createQuery()

最後に問題は、ACL を使用して sonata ユーザーをフィルタリングする方法です。

4

2 に答える 2