vendor/pimcore/pimcore/lib/Security/User/ObjectUserProvider.php line 74

Open in your IDE?
  1. <?php
  2. /**
  3. * Pimcore
  4. *
  5. * This source file is available under two different licenses:
  6. * - GNU General Public License version 3 (GPLv3)
  7. * - Pimcore Commercial License (PCL)
  8. * Full copyright and license information is available in
  9. * LICENSE.md which is distributed with this source code.
  10. *
  11. * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12. * @license http://www.pimcore.org/license GPLv3 and PCL
  13. */
  14. namespace Pimcore\Security\User;
  15. use Pimcore\Model\DataObject\AbstractObject;
  16. use Symfony\Component\Security\Core\Exception\InvalidArgumentException;
  17. use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
  18. use Symfony\Component\Security\Core\Exception\UserNotFoundException;
  19. use Symfony\Component\Security\Core\User\UserInterface;
  20. use Symfony\Component\Security\Core\User\UserProviderInterface;
  21. /**
  22. * @internal
  23. *
  24. * User provider loading users from pimcore objects. To load users, the provider needs
  25. * to know which kind of users to load (className) and which field to query for the
  26. * username (usernameField).
  27. *
  28. * Example DI configuration loading from the App\Model\DataObject\User class and searching by username:
  29. *
  30. * website_demo.security.user_provider:
  31. * class: Pimcore\Security\User\ObjectUserProvider
  32. * arguments: ['App\Model\DataObject\User', 'username']
  33. */
  34. class ObjectUserProvider implements UserProviderInterface
  35. {
  36. /**
  37. * The pimcore class name to be used. Needs to be a fully qualified class
  38. * name (e.g. Pimcore\Model\DataObject\User or your custom user class extending
  39. * the generated one.
  40. *
  41. * @var string
  42. */
  43. protected $className;
  44. /**
  45. * @var string
  46. */
  47. protected $usernameField = 'username';
  48. /**
  49. * @param string $className
  50. * @param string $usernameField
  51. */
  52. public function __construct($className, $usernameField = 'username')
  53. {
  54. $this->setClassName($className);
  55. $this->usernameField = $usernameField;
  56. }
  57. /**
  58. * @param string $className
  59. */
  60. protected function setClassName($className)
  61. {
  62. if (empty($className)) {
  63. throw new InvalidArgumentException('Object class name is empty');
  64. }
  65. if (!class_exists($className)) {
  66. throw new InvalidArgumentException(sprintf('User class %s does not exist', $className));
  67. }
  68. $reflector = new \ReflectionClass($className);
  69. if (!$reflector->isSubclassOf(AbstractObject::class)) {
  70. throw new InvalidArgumentException(sprintf('User class %s must be a subclass of %s', $className, AbstractObject::class));
  71. }
  72. $this->className = $className;
  73. }
  74. /**
  75. * {@inheritdoc}
  76. */
  77. public function loadUserByIdentifier(string $username)
  78. {
  79. $getter = sprintf('getBy%s', ucfirst($this->usernameField));
  80. // User::getByUsername($username, 1);
  81. $user = call_user_func_array([$this->className, $getter], [$username, 1]);
  82. if ($user && $user instanceof $this->className) {
  83. return $user;
  84. }
  85. throw new UserNotFoundException(sprintf('User %s was not found', $username));
  86. }
  87. /**
  88. * {@inheritdoc}
  89. *
  90. * @deprecated use loadUserByIdentifier() instead.
  91. */
  92. public function loadUserByUsername($username)
  93. {
  94. return $this->loadUserByIdentifier($username);
  95. }
  96. /**
  97. * {@inheritdoc}
  98. */
  99. public function refreshUser(UserInterface $user)
  100. {
  101. if (!$user instanceof $this->className || !$user instanceof AbstractObject) {
  102. throw new UnsupportedUserException();
  103. }
  104. $refreshedUser = call_user_func_array([$this->className, 'getById'], [$user->getId()]);
  105. return $refreshedUser;
  106. }
  107. /**
  108. * {@inheritdoc}
  109. */
  110. public function supportsClass($class)
  111. {
  112. return $class === $this->className;
  113. }
  114. }