* * 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; use Symfony\Component\Ldap\Exception\ConnectionException; use Symfony\Component\Ldap\LdapClientInterface; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; /** * LdapUserProvider is a simple user provider on top of ldap. * * @author Grégoire Pineau * @author Charles Sarrazin */ class LdapUserProvider implements UserProviderInterface { private $ldap; private $baseDn; private $searchDn; private $searchPassword; private $defaultRoles; private $defaultSearch; /** * @param LdapClientInterface $ldap * @param string $baseDn * @param string $searchDn * @param string $searchPassword * @param array $defaultRoles * @param string $uidKey * @param string $filter */ public function __construct(LdapClientInterface $ldap, $baseDn, $searchDn = null, $searchPassword = null, array $defaultRoles = array(), $uidKey = 'sAMAccountName', $filter = '({uid_key}={username})') { $this->ldap = $ldap; $this->baseDn = $baseDn; $this->searchDn = $searchDn; $this->searchPassword = $searchPassword; $this->defaultRoles = $defaultRoles; $this->defaultSearch = str_replace('{uid_key}', $uidKey, $filter); } /** * {@inheritdoc} */ public function loadUserByUsername($username) { try { $this->ldap->bind($this->searchDn, $this->searchPassword); $username = $this->ldap->escape($username, '', LDAP_ESCAPE_FILTER); $query = str_replace('{username}', $username, $this->defaultSearch); $search = $this->ldap->find($this->baseDn, $query); } catch (ConnectionException $e) { throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username), 0, $e); } if (!$search) { throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username)); } if ($search['count'] > 1) { throw new UsernameNotFoundException('More than one user found'); } $user = $search[0]; return $this->loadUser($username, $user); } public function loadUser($username, $user) { $password = isset($user['userpassword']) ? $user['userpassword'] : null; $roles = $this->defaultRoles; return new User($username, $password, $roles); } /** * {@inheritdoc} */ public function refreshUser(UserInterface $user) { if (!$user instanceof User) { throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', \get_class($user))); } return new User($user->getUsername(), null, $user->getRoles()); } /** * {@inheritdoc} */ public function supportsClass($class) { return 'Symfony\Component\Security\Core\User\User' === $class; } }