8000 [Security] allowed class names to be passed as an argument to Encoder… · symfony/symfony@0b8b76b · GitHub
[go: up one dir, main page]

Skip to content

Commit 0b8b76b

Browse files
committed
[Security] allowed class names to be passed as an argument to EncoderFactoryInterface::getEncoder()
1 parent b27d9b5 commit 0b8b76b

File tree

4 files changed

+28
-6
lines changed

4 files changed

+28
-6
lines changed

src/Symfony/Component/Security/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
2.1.0
55
-----
66

7+
* EncoderFactoryInterface::getEncoder() can now also take a class name as an argument
78
* allow switching to the user that is already impersonated
89
* added support for the remember_me parameter in the query
910
* added AccessMapInterface

src/Symfony/Component/Security/Core/Encoder/EncoderFactory.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ public function __construct(array $encoders)
3030
/**
3131
* {@inheritDoc}
3232
*/
33-
public function getEncoder(UserInterface $user)
33+
public function getEncoder($user)
3434
{
3535
foreach ($this->encoders as $class => $encoder) {
36-
if (!$user instanceof $class) {
36+
if ((is_object($user) && !$user instanceof $class) || (!is_subclass_of($user, $class) && $user != $class)) {
3737
continue;
3838
}
3939

@@ -44,7 +44,7 @@ public function getEncoder(UserInterface $user)
4444
return $this->encoders[$class];
4545
}
4646

47-
throw new \RuntimeException(sprintf('No encoder has been configured for account "%s".', get_class($user)));
47+
throw new \RuntimeException(sprintf('No encoder has been configured for account "%s".', is_object($class) ? get_class($user) : $class));
4848
}
4949

5050
/**

src/Symfony/Component/Security/Core/Encoder/EncoderFactoryInterface.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@ interface EncoderFactoryInterface
2323
/**
2424
* Returns the password encoder to use for the given account.
2525
*
26-
* @param UserInterface $user
26+
* @param UserInterface|string $user A UserInterface instance of a class name
2727
*
28-
* @return PasswordEncoderInterface never null
28+
* @return PasswordEncoderInterface
29+
*
30+
* @throws \RuntimeException when no password encoder could be found for the user
2931
*/
30-
function getEncoder(UserInterface $user);
32+
function getEncoder($user);
3133
}

src/Symfony/Component/Security/Tests/Core/Encoder/EncoderFactoryTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
1515
use Symfony\Component\Security\Core\Encoder\EncoderFactory;
16+
use Symfony\Component\Security\Core\User\User;
1617

1718
class EncoderFactoryTest extends \PHPUnit_Framework_TestCase
1819
{
@@ -37,7 +38,25 @@ public function testGetEncoderWithService()
3738

3839
$encoder = $factory->getEncoder($this->getMock('Symfony\Component\Security\Core\User\UserInterface'));
3940
$expectedEncoder = new MessageDigestPasswordEncoder('sha1');
41+
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
42+
43+
$encoder = $factory->getEncoder(new User('user', 'pass'));
44+
$expectedEncoder = new MessageDigestPasswordEncoder('sha1');
45+
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
46+
}
47+
48+
public function testGetEncoderWithClassName()
49+
{
50+
$factory = new EncoderFactory(array(
51+
'Symfony\Component\Security\Core\User\UserInterface' => new MessageDigestPasswordEncoder('sha1'),
52+
));
4053

54+
$encoder = $factory->getEncoder('Symfony\Component\Security\Core\User\UserInterface');
55+
$expectedEncoder = new MessageDigestPasswordEncoder('sha1');
56+
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
57+
58+
$encoder = $factory->getEncoder('Symfony\Component\Security\Core\User\User');
59+
$expectedEncoder = new MessageDigestPasswordEncoder('sha1');
4160
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
4261
}
4362
}

0 commit comments

Comments
 (0)
0