summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Authentication/Provider/DaoAuthenticationProvider.php16
-rw-r--r--Encoder/EncoderFactory.php77
-rw-r--r--Encoder/EncoderFactoryInterface.php30
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