src/Infraestructure/Security/LdapNewUserProvider.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\Infraestructure\Security;
  3. use App\Domain\Entity\SonataUserUser;
  4. use App\Infraestructure\Persistence\Doctrine\Repository\SonataUserUserRepository;
  5. use Symfony\Component\Ldap\Entry;
  6. use Symfony\Component\Ldap\Exception\ConnectionException;
  7. use Symfony\Component\Ldap\LdapInterface;
  8. use Symfony\Component\Ldap\Security\LdapUserProvider;
  9. use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
  10. use Symfony\Component\Security\Core\Exception\UserNotFoundException;
  11. use Symfony\Component\Security\Core\User\UserInterface;
  12. class LdapNewUserProvider extends LdapUserProvider
  13. {
  14.     public function __construct(
  15.         LdapInterface $ldap,
  16.         private SonataUserUserRepository $sonataUserUserRepository,
  17.         string $baseDn,
  18.         string $searchDn = null,
  19.         string $searchPassword = '',
  20.         string $defaultRoles,
  21.         string $uidKey = null,
  22.         string $filter = null,
  23.         string $passwordAttribute = null,
  24.         array $extraFields = []
  25.     ) {
  26.         parent::__construct(
  27.             $ldap,
  28.             $baseDn,
  29.             $searchDn,
  30.             $searchPassword,
  31.             unserialize($defaultRoles),
  32.             $uidKey,
  33.             $filter,
  34.             $passwordAttribute,
  35.             $extraFields
  36.         );
  37.     }
  38.     public function refreshUser(UserInterface $user)
  39.     {
  40.         if (!$this->supportsClass(get_class($user))) {
  41.             throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_debug_type($user)));
  42.         }
  43.         $reloadUser = $this->sonataUserUserRepository->findOneByUsername($user->getUsername());
  44.         return $reloadUser;
  45.     }
  46.     public function supportsClass(string $class)
  47.     {
  48.         return SonataUserUser::class === $class;
  49.     }
  50.     protected function loadUser(string $identifier, Entry $entry)
  51.     {
  52.         $usuario = $this->sonataUserUserRepository->findOneByUsername($identifier);
  53.         if (!$usuario) {
  54.             try {
  55.                 $ldapEntry = $this->loadLdapUser($identifier);
  56.                 $usuario = new SonataUserUser();
  57.                 $usuario->setUsername($identifier);
  58.                 $usuario->setEmail($ldapEntry->getAttribute('mail')[0] ?? '');
  59.                 $usuario->setRoles($this->defaultRoles);
  60.                 $usuario->setEnabled(true);
  61.                 $usuario->setPassword(md5(time()));
  62.                 $this->sonataUserUserRepository->save($usuario);
  63.             } catch (ConnectionException $e) {
  64.                 throw new UserNotFoundException(sprintf('User "%s" not found in LDAP.', $identifier));
  65.             }
  66.         }
  67.         return $usuario;
  68.     }
  69.     private function loadLdapUser(string $identifier): Entry
  70.     {
  71.         $query   = $this->ldap->query($this->baseDn, sprintf('(%s=%s)', $this->uidKey, $identifier));
  72.         $results = $query->execute();
  73.         if (count($results) === 0) {
  74.             throw new UserNotFoundException(sprintf('User "%s" not found in LDAP.', $identifier));
  75.         }
  76.         return $results[0];
  77.     }
  78. }//class