vendor/symfony/security-core/Authentication/Token/AbstractToken.php line 265

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Security\Core\Authentication\Token;
  11. use Symfony\Component\Security\Core\Role\Role;
  12. use Symfony\Component\Security\Core\User\AdvancedUserInterface;
  13. use Symfony\Component\Security\Core\User\EquatableInterface;
  14. use Symfony\Component\Security\Core\User\UserInterface;
  15. /**
  16.  * Base class for Token instances.
  17.  *
  18.  * @author Fabien Potencier <fabien@symfony.com>
  19.  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
  20.  */
  21. abstract class AbstractToken implements TokenInterface
  22. {
  23.     private $user;
  24.     private $roles = [];
  25.     private $authenticated false;
  26.     private $attributes = [];
  27.     /**
  28.      * @param (Role|string)[] $roles An array of roles
  29.      *
  30.      * @throws \InvalidArgumentException
  31.      */
  32.     public function __construct(array $roles = [])
  33.     {
  34.         foreach ($roles as $role) {
  35.             if (\is_string($role)) {
  36.                 $role = new Role($role);
  37.             } elseif (!$role instanceof Role) {
  38.                 throw new \InvalidArgumentException(sprintf('$roles must be an array of strings, or Role instances, but got %s.', \gettype($role)));
  39.             }
  40.             $this->roles[] = $role;
  41.         }
  42.     }
  43.     /**
  44.      * {@inheritdoc}
  45.      */
  46.     public function getRoles()
  47.     {
  48.         return $this->roles;
  49.     }
  50.     /**
  51.      * {@inheritdoc}
  52.      */
  53.     public function getUsername()
  54.     {
  55.         if ($this->user instanceof UserInterface) {
  56.             return $this->user->getUsername();
  57.         }
  58.         return (string) $this->user;
  59.     }
  60.     /**
  61.      * {@inheritdoc}
  62.      */
  63.     public function getUser()
  64.     {
  65.         return $this->user;
  66.     }
  67.     /**
  68.      * {@inheritdoc}
  69.      */
  70.     public function setUser($user)
  71.     {
  72.         if (!($user instanceof UserInterface || (\is_object($user) && method_exists($user'__toString')) || \is_string($user))) {
  73.             throw new \InvalidArgumentException('$user must be an instanceof UserInterface, an object implementing a __toString method, or a primitive string.');
  74.         }
  75.         if (null === $this->user) {
  76.             $changed false;
  77.         } elseif ($this->user instanceof UserInterface) {
  78.             if (!$user instanceof UserInterface) {
  79.                 $changed true;
  80.             } else {
  81.                 $changed $this->hasUserChanged($user);
  82.             }
  83.         } elseif ($user instanceof UserInterface) {
  84.             $changed true;
  85.         } else {
  86.             $changed = (string) $this->user !== (string) $user;
  87.         }
  88.         if ($changed) {
  89.             $this->setAuthenticated(false);
  90.         }
  91.         $this->user $user;
  92.     }
  93.     /**
  94.      * {@inheritdoc}
  95.      */
  96.     public function isAuthenticated()
  97.     {
  98.         return $this->authenticated;
  99.     }
  100.     /**
  101.      * {@inheritdoc}
  102.      */
  103.     public function setAuthenticated($authenticated)
  104.     {
  105.         $this->authenticated = (bool) $authenticated;
  106.     }
  107.     /**
  108.      * {@inheritdoc}
  109.      */
  110.     public function eraseCredentials()
  111.     {
  112.         if ($this->getUser() instanceof UserInterface) {
  113.             $this->getUser()->eraseCredentials();
  114.         }
  115.     }
  116.     /**
  117.      * {@inheritdoc}
  118.      */
  119.     public function serialize()
  120.     {
  121.         $serialized = [$this->user$this->authenticated$this->roles$this->attributes];
  122.         return $this->doSerialize($serialized, \func_num_args() ? func_get_arg(0) : null);
  123.     }
  124.     /**
  125.      * {@inheritdoc}
  126.      */
  127.     public function unserialize($serialized)
  128.     {
  129.         list($this->user$this->authenticated$this->roles$this->attributes) = \is_array($serialized) ? $serialized unserialize($serialized);
  130.     }
  131.     /**
  132.      * Returns the token attributes.
  133.      *
  134.      * @return array The token attributes
  135.      */
  136.     public function getAttributes()
  137.     {
  138.         return $this->attributes;
  139.     }
  140.     /**
  141.      * Sets the token attributes.
  142.      *
  143.      * @param array $attributes The token attributes
  144.      */
  145.     public function setAttributes(array $attributes)
  146.     {
  147.         $this->attributes $attributes;
  148.     }
  149.     /**
  150.      * Returns true if the attribute exists.
  151.      *
  152.      * @param string $name The attribute name
  153.      *
  154.      * @return bool true if the attribute exists, false otherwise
  155.      */
  156.     public function hasAttribute($name)
  157.     {
  158.         return \array_key_exists($name$this->attributes);
  159.     }
  160.     /**
  161.      * Returns an attribute value.
  162.      *
  163.      * @param string $name The attribute name
  164.      *
  165.      * @return mixed The attribute value
  166.      *
  167.      * @throws \InvalidArgumentException When attribute doesn't exist for this token
  168.      */
  169.     public function getAttribute($name)
  170.     {
  171.         if (!\array_key_exists($name$this->attributes)) {
  172.             throw new \InvalidArgumentException(sprintf('This token has no "%s" attribute.'$name));
  173.         }
  174.         return $this->attributes[$name];
  175.     }
  176.     /**
  177.      * Sets an attribute.
  178.      *
  179.      * @param string $name  The attribute name
  180.      * @param mixed  $value The attribute value
  181.      */
  182.     public function setAttribute($name$value)
  183.     {
  184.         $this->attributes[$name] = $value;
  185.     }
  186.     /**
  187.      * {@inheritdoc}
  188.      */
  189.     public function __toString()
  190.     {
  191.         $class = \get_class($this);
  192.         $class substr($classstrrpos($class'\\') + 1);
  193.         $roles = [];
  194.         foreach ($this->roles as $role) {
  195.             $roles[] = $role->getRole();
  196.         }
  197.         return sprintf('%s(user="%s", authenticated=%s, roles="%s")'$class$this->getUsername(), json_encode($this->authenticated), implode(', '$roles));
  198.     }
  199.     /**
  200.      * @internal
  201.      */
  202.     protected function doSerialize($serialized$isCalledFromOverridingMethod)
  203.     {
  204.         if (null === $isCalledFromOverridingMethod) {
  205.             $trace debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT3);
  206.             $isCalledFromOverridingMethod = isset($trace[2]['function'], $trace[2]['object']) && 'serialize' === $trace[2]['function'] && $this === $trace[2]['object'];
  207.         }
  208.         return $isCalledFromOverridingMethod $serialized serialize($serialized);
  209.     }
  210.     private function hasUserChanged(UserInterface $user)
  211.     {
  212.         if (!($this->user instanceof UserInterface)) {
  213.             throw new \BadMethodCallException('Method "hasUserChanged" should be called when current user class is instance of "UserInterface".');
  214.         }
  215.         if ($this->user instanceof EquatableInterface) {
  216.             return !(bool) $this->user->isEqualTo($user);
  217.         }
  218.         if ($this->user->getPassword() !== $user->getPassword()) {
  219.             return true;
  220.         }
  221.         if ($this->user->getSalt() !== $user->getSalt()) {
  222.             return true;
  223.         }
  224.         if ($this->user->getUsername() !== $user->getUsername()) {
  225.             return true;
  226.         }
  227.         if ($this->user instanceof AdvancedUserInterface && $user instanceof AdvancedUserInterface) {
  228.             @trigger_error(sprintf('Checking for the AdvancedUserInterface in "%s()" is deprecated since Symfony 4.1 and support for it will be removed in 5.0. Implement the %s to check if the user has been changed,'__METHOD__EquatableInterface::class), E_USER_DEPRECATED);
  229.             if ($this->user->isAccountNonExpired() !== $user->isAccountNonExpired()) {
  230.                 return true;
  231.             }
  232.             if ($this->user->isAccountNonLocked() !== $user->isAccountNonLocked()) {
  233.                 return true;
  234.             }
  235.             if ($this->user->isCredentialsNonExpired() !== $user->isCredentialsNonExpired()) {
  236.                 return true;
  237.             }
  238.             if ($this->user->isEnabled() !== $user->isEnabled()) {
  239.                 return true;
  240.             }
  241.         } elseif ($this->user instanceof AdvancedUserInterface xor $user instanceof AdvancedUserInterface) {
  242.             @trigger_error(sprintf('Checking for the AdvancedUserInterface in "%s()" is deprecated since Symfony 4.1 and support for it will be removed in 5.0. Implement the %s to check if the user has been changed,'__METHOD__EquatableInterface::class), E_USER_DEPRECATED);
  243.             return true;
  244.         }
  245.         return false;
  246.     }
  247. }