src/AppBundle/Security/CustomVoter.php line 17

Open in your IDE?
  1. <?php
  2. namespace AppBundle\Security;
  3. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  4. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  5. use Symfony\Component\DependencyInjection\ContainerInterface;
  6. use AppBundle\Entity\User;
  7. use AppBundle\Entity\Master\UserGroup;
  8. /**
  9.  * ユーザーの認可を扱うクラス
  10.  *
  11.  * Class CustomVoter
  12.  * @package AppBundle\Security
  13.  */
  14. class CustomVoter extends Voter
  15. {
  16.     protected $container;
  17.     public function __construct(ContainerInterface $container)
  18.     {
  19.         $this->container $container;
  20.     }
  21.     protected function supports($attribute$subject)
  22.     {
  23.         return true;
  24.     }
  25.     /**
  26.      * ユーザーがsubjectに対し何かを行う権限があるかを検証する
  27.      * subject は指定がない場合 null となる
  28.      *
  29.      * @param string $attribute
  30.      * @param mixed $subject
  31.      * @param TokenInterface $token
  32.      * @return bool
  33.      */
  34.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  35.     {
  36.         $attribute strtolower($attribute);
  37.         $user $token->getUser();
  38.         // ログインしていない場合は認可しない
  39.         if (!$user instanceof User) {
  40.             return false;
  41.         }
  42.         $group $user->group;
  43.         // グループに属していない場合は認可しない
  44.         if(!$group instanceof UserGroup) {
  45.             return false;
  46.         }
  47.         // 管理者はすべての権限を持つ
  48.         if($user->isAdmin()){
  49.             return true;
  50.         }
  51.         $privileges $group->privileges;
  52.         // アクションに対する権限を持っていれば許可
  53.         foreach($privileges as $privilege){
  54.             if($privilege->getName() === $attribute){
  55.                 return true;
  56.             }
  57.         }
  58.         return false;
  59.     }
  60. }