diff options
-rw-r--r-- | Authentication/Provider/DaoAuthenticationProvider.php | 16 | ||||
-rw-r--r-- | Encoder/EncoderFactory.php | 77 | ||||
-rw-r--r-- | Encoder/EncoderFactoryInterface.php | 30 |
3 files changed, 113 insertions, 10 deletions
diff --git a/Authentication/Provider/DaoAuthenticationProvider.php b/Authentication/Provider/DaoAuthenticationProvider.php index eaf3242..a44584f 100644 --- a/Authentication/Provider/DaoAuthenticationProvider.php +++ b/Authentication/Provider/DaoAuthenticationProvider.php @@ -2,11 +2,10 @@ namespace Symfony\Component\Security\Authentication\Provider; +use Symfony\Component\Security\Encoder\EncoderFactoryInterface; use Symfony\Component\Security\User\UserProviderInterface; use Symfony\Component\Security\User\AccountCheckerInterface; use Symfony\Component\Security\User\AccountInterface; -use Symfony\Component\Security\Encoder\PasswordEncoderInterface; -use Symfony\Component\Security\Encoder\PlaintextPasswordEncoder; use Symfony\Component\Security\Exception\UsernameNotFoundException; use Symfony\Component\Security\Exception\AuthenticationServiceException; use Symfony\Component\Security\Exception\BadCredentialsException; @@ -29,7 +28,7 @@ use Symfony\Component\Security\Authentication\Token\UsernamePasswordToken; */ class DaoAuthenticationProvider extends UserAuthenticationProvider { - protected $passwordEncoder; + protected $encoderFactory; protected $userProvider; /** @@ -37,16 +36,13 @@ class DaoAuthenticationProvider extends UserAuthenticationProvider * * @param UserProviderInterface $userProvider A UserProviderInterface instance * @param AccountCheckerInterface $accountChecker An AccountCheckerInterface instance - * @param PasswordEncoderInterface $passwordEncoder A PasswordEncoderInterface instance + * @param EncoderFactoryInterface $encoderFactory A EncoderFactoryInterface instance */ - public function __construct(UserProviderInterface $userProvider, AccountCheckerInterface $accountChecker, PasswordEncoderInterface $passwordEncoder = null, $hideUserNotFoundExceptions = true) + public function __construct(UserProviderInterface $userProvider, AccountCheckerInterface $accountChecker, EncoderFactoryInterface $encoderFactory, $hideUserNotFoundExceptions = true) { parent::__construct($accountChecker, $hideUserNotFoundExceptions); - if (null === $passwordEncoder) { - $passwordEncoder = new PlaintextPasswordEncoder(); - } - $this->passwordEncoder = $passwordEncoder; + $this->encoderFactory = $encoderFactory; $this->userProvider = $userProvider; } @@ -65,7 +61,7 @@ class DaoAuthenticationProvider extends UserAuthenticationProvider throw new BadCredentialsException('Bad credentials'); } - if (!$this->passwordEncoder->isPasswordValid($account->getPassword(), $presentedPassword, $account->getSalt())) { + if (!$this->encoderFactory->getEncoder($account)->isPasswordValid($account->getPassword(), $presentedPassword, $account->getSalt())) { throw new BadCredentialsException('Bad credentials'); } } diff --git a/Encoder/EncoderFactory.php b/Encoder/EncoderFactory.php new file mode 100644 index 0000000..5462ac2 --- /dev/null +++ b/Encoder/EncoderFactory.php @@ -0,0 +1,77 @@ +<?php + +namespace Symfony\Component\Security\Encoder; + +use Symfony\Component\Security\User\AccountInterface; + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien.potencier@symfony-project.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * A generic encoder factory implementation + * + * @author Johannes M. Schmitt <schmittjoh@gmail.com> + */ +class EncoderFactory implements EncoderFactoryInterface +{ + protected $encoders; + protected $encoderMap; + + public function __construct(array $encoderMap) + { + $this->encoders = array(); + $this->encoderMap = $encoderMap; + } + + /** + * {@inheritDoc} + */ + public function getEncoder(AccountInterface $account) + { + foreach ($this->encoders as $class => $encoder) { + if ($account instanceof $class) { + return $encoder; + } + } + + return $this->createEncoder($account); + } + + /** + * Adds an encoder instance to the factory + * + * @param string $class + * @param PasswordEncoderInterface $encoder + * @return void + */ + public function addEncoder($class, PasswordEncoderInterface $encoder) + { + $this->encoders[$class] = $encoder; + } + + /** + * Creates the actual encoder instance + * + * @param AccountInterface $account + * @return PasswordEncoderInterface + */ + protected function createEncoder($account) + { + foreach ($this->encoderMap as $class => $config) { + if ($account instanceof $class) { + $reflection = new \ReflectionClass($config['class']); + $this->encoders[$class] = $reflection->newInstanceArgs($config['arguments']); + + return $this->encoders[$class]; + } + } + + throw new \InvalidArgumentException(sprintf('No encoder has been configured for account "%s".', get_class($account))); + } +}
\ No newline at end of file diff --git a/Encoder/EncoderFactoryInterface.php b/Encoder/EncoderFactoryInterface.php new file mode 100644 index 0000000..0c62b35 --- /dev/null +++ b/Encoder/EncoderFactoryInterface.php @@ -0,0 +1,30 @@ +<?php + +namespace Symfony\Component\Security\Encoder; + +use Symfony\Component\Security\User\AccountInterface; + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien.potencier@symfony-project.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * EncoderFactoryInterface to support different encoders for different accounts. + * + * @author Johannes M. Schmitt <schmittjoh@gmail.com> + */ +interface EncoderFactoryInterface +{ + /** + * Returns the password encoder to use for the given account + * + * @param AccountInterface $account + * @return PasswordEncoderInterface never null + */ + function getEncoder(AccountInterface $account); +}
\ No newline at end of file |