* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Security\Core\User; /** * User is the user implementation used by the in-memory user provider. * * This should not be used for anything else. * * @author Fabien Potencier */ final class User implements UserInterface, EquatableInterface { private $username; private $password; private $enabled; private $accountNonExpired; private $credentialsNonExpired; private $accountNonLocked; private $roles; private $extraFields; public function __construct(?string $username, ?string $password, array $roles = [], bool $enabled = true, bool $userNonExpired = true, bool $credentialsNonExpired = true, bool $userNonLocked = true, array $extraFields = []) { if ('' === $username || null === $username) { throw new \InvalidArgumentException('The username cannot be empty.'); } $this->username = $username; $this->password = $password; $this->enabled = $enabled; $this->accountNonExpired = $userNonExpired; $this->credentialsNonExpired = $credentialsNonExpired; $this->accountNonLocked = $userNonLocked; $this->roles = $roles; $this->extraFields = $extraFields; } public function __toString(): string { return $this->getUsername(); } /** * {@inheritdoc} */ public function getRoles(): array { return $this->roles; } /** * {@inheritdoc} */ public function getPassword(): ?string { return $this->password; } /** * {@inheritdoc} */ public function getSalt(): ?string { return null; } /** * {@inheritdoc} */ public function getUsername(): string { return $this->username; } /** * Checks whether the user's account has expired. * * Internally, if this method returns false, the authentication system * will throw an AccountExpiredException and prevent login. * * @return bool true if the user's account is non expired, false otherwise * * @see AccountExpiredException */ public function isAccountNonExpired(): bool { return $this->accountNonExpired; } /** * Checks whether the user is locked. * * Internally, if this method returns false, the authentication system * will throw a LockedException and prevent login. * * @return bool true if the user is not locked, false otherwise * * @see LockedException */ public function isAccountNonLocked(): bool { return $this->accountNonLocked; } /** * Checks whether the user's credentials (password) has expired. * * Internally, if this method returns false, the authentication system * will throw a CredentialsExpiredException and prevent login. * * @return bool true if the user's credentials are non expired, false otherwise * * @see CredentialsExpiredException */ public function isCredentialsNonExpired(): bool { return $this->credentialsNonExpired; } /** * Checks whether the user is enabled. * * Internally, if this method returns false, the authentication system * will throw a DisabledException and prevent login. * * @return bool true if the user is enabled, false otherwise * * @see DisabledException */ public function isEnabled(): bool { return $this->enabled; } /** * {@inheritdoc} */ public function eraseCredentials() { } public function getExtraFields(): array { return $this->extraFields; } /** * {@inheritdoc} */ public function isEqualTo(UserInterface $user): bool { if (!$user instanceof self) { return false; } if ($this->getPassword() !== $user->getPassword()) { return false; } if ($this->getSalt() !== $user->getSalt()) { return false; } $currentRoles = array_map('strval', (array) $this->getRoles()); $newRoles = array_map('strval', (array) $user->getRoles()); $rolesChanged = \count($currentRoles) !== \count($newRoles) || \count($currentRoles) !== \count(array_intersect($currentRoles, $newRoles)); if ($rolesChanged) { return false; } if ($this->getUsername() !== $user->getUsername()) { return false; } if ($this->isAccountNonExpired() !== $user->isAccountNonExpired()) { return false; } if ($this->isAccountNonLocked() !== $user->isAccountNonLocked()) { return false; } if ($this->isCredentialsNonExpired() !== $user->isCredentialsNonExpired()) { return false; } if ($this->isEnabled() !== $user->isEnabled()) { return false; } return true; } public function setPassword(string $password) { $this->password = $password; } }