|
15 | 15 | use Symfony\Component\Security\Core\Encoder\EncoderAwareInterface;
|
16 | 16 | use Symfony\Component\Security\Core\Encoder\EncoderFactory;
|
17 | 17 | use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
|
| 18 | +use Symfony\Component\Security\Core\Encoder\MigratingPasswordEncoder; |
| 19 | +use Symfony\Component\Security\Core\Encoder\NativePasswordEncoder; |
| 20 | +use Symfony\Component\Security\Core\Encoder\SodiumPasswordEncoder; |
18 | 21 | use Symfony\Component\Security\Core\User\User;
|
19 | 22 | use Symfony\Component\Security\Core\User\UserInterface;
|
20 | 23 |
|
@@ -131,6 +134,44 @@ public function testGetEncoderForEncoderAwareWithClassName()
|
131 | 134 | $expectedEncoder = new MessageDigestPasswordEncoder('sha1');
|
132 | 135 | $this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
|
133 | 136 | }
|
| 137 | + |
| 138 | + public function testMigrateFrom() |
| 139 | + { |
| 140 | + if (!SodiumPasswordEncoder::isSupported()) { |
| 141 | + $this->markTestSkipped('Sodium is not available'); |
| 142 | + } |
| 143 | + |
| 144 | + $factory = new EncoderFactory([ |
| 145 | + 'digest_encoder' => $digest = new MessageDigestPasswordEncoder('sha256'), |
| 146 | + 'pbdkf2' => $digest = new MessageDigestPasswordEncoder('sha256'), |
| 147 | + 'bcrypt_encoder' => ['algorithm' => 'bcrypt'], |
| 148 | + SomeUser::class => ['algorithm' => 'sodium', 'migrate_from' => ['bcrypt_encoder', 'digest_encoder']], |
| 149 | + ]); |
| 150 | + |
| 151 | + $encoder = $factory->getEncoder(SomeUser::class); |
| 152 | + $this->assertInstanceOf(MigratingPasswordEncoder::class, $encoder); |
| 153 | + |
| 154 | + $this->assertTrue($encoder->isPasswordValid((new SodiumPasswordEncoder())->encodePassword('foo', null), 'foo', null)); |
| 155 | + $this->assertTrue($encoder->isPasswordValid((new NativePasswordEncoder(null, null, null, \PASSWORD_BCRYPT))->encodePassword('foo', null), 'foo', null)); |
| 156 | + $this->assertTrue($encoder->isPasswordValid($digest->encodePassword('foo', null), 'foo', null)); |
| 157 | + } |
| 158 | + |
| 159 | + public function testDefaultMigratingEncoders() |
| 160 | + { |
| 161 | + $this->assertInstanceOf( |
| 162 | + MigratingPasswordEncoder::class, |
| 163 | + (new EncoderFactory([SomeUser::class => ['class' => NativePasswordEncoder::class, 'arguments' => []]]))->getEncoder(SomeUser::class) |
| 164 | + ); |
| 165 | + |
| 166 | + if (!SodiumPasswordEncoder::isSupported()) { |
| 167 | + return; |
| 168 | + } |
| 169 | + |
| 170 | + $this->assertInstanceOf( |
| 171 | + MigratingPasswordEncoder::class, |
| 172 | + (new EncoderFactory([SomeUser::class => ['class' => SodiumPasswordEncoder::class, 'arguments' => []]]))->getEncoder(SomeUser::class) |
| 173 | + ); |
| 174 | + } |
134 | 175 | }
|
135 | 176 |
|
136 | 177 | class SomeUser implements UserInterface
|
|
0 commit comments