2016-08-09 16 views
0

私のウェブサイトで購読することができます。私はFOSUserBundleを使用します。 ユーザーが購読すると、ROLE_SUBSCRIBERロールを獲得し、新しいページへのアクセス権を付与します。 私はUserエンティティに記録した期間の後にこのロールを期限切れにしたいと思います。ロールの有効期限Symfony

class User extends BaseUser 
{ 
    // ... 

    * @ORM\Column(type="datetime") 
    protected $subscribeExpiration; 


    public function setSubscribeExpiration(\DateTime $subscribeExpiration) { 
     $this->subscribeExpiration = clone $subscribeExpiration; 

     return $this; 
    } 
    public function getSubscribeExpiration() { 
     return $this->subscribeExpiration; 
    } 

    // ... 
} 

答えて

1

ROLEは使用せず、Voterを使用してください。

// src/AppBundle/Security/PostVoter.php 
namespace AppBundle\Security; 

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Security\Core\Authorization\Voter\Voter; 

use AppBundle\Entity\User; 

class SubscriberVoter extends Voter 
{ 
    const IS_SUBSCRIBER = 'is_subscriber'; 

    protected function supports($attribute, $subject) 
    { 
     if (!in_array($attribute, array(self::IS_SUBSCRIBER))) { 
      return false; 
     } 

     return true; 
    } 

    protected function voteOnAttribute($attribute, $subject, TokenInterface $token) 
    { 
     $user = $token->getUser(); 

     if (!$user instanceof User) { 
      // the user must be logged in; if not, deny access 
      return false; 
     } 

     // you know $subject is a Post object, thanks to supports 
     /** @var Post $post */ 
     $post = $subject; 

     switch ($attribute) { 
      case self::IS_SUBSCRIBER: 
       $expireDate = $user->getSubscriberExpireDate(); 
       $currendDate = new \DateTime(); 

       return (null !== $expireDate && $expireDate > $currendDate); 
     } 

     throw new \LogicException('This code should not be reached!'); 
    } 
} 

は、この '役割' を確認するには::

$this->isGranted('is_subscriber'); 
ユーザーがsubsciberであるかどうか

次に、あなたの有権者のチェックにEXPIREDATEを決定するために

関連する問題