想通了!
创建自定义编码器并使用FOSAdvancedEncoder捆绑包选择适当的编码器。
1.创建编码器
<?php
namespace Acme\MyBundle\Security\Encoder;
use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface;
class LegacyEncoder implements PasswordEncoderInterface {
public function encodePassword($raw, $salt)
{
// Your Custom encoder logic
return $something
}
public function isPasswordValid($encoded, $raw, $salt)
{
return $encoded === $this->encodePassword($raw, $salt);
}
}
2.注册编码器作为服务
services:
acme.legacy_encoder:
class: Acme\MyBundle\Security\Encoder\LegacyEncoder
3.安装FOSAdvancedEncoderBundle
看看这里:https://github.com/friendsofsymfony/FOSAdvancedEncoderBundle/blob/master/Resources/doc/index.md
个
4.配置您的编码器
在app/config.yml
:
fos_advanced_encoder:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
legacy_encoder:
id: acme.legacy_encoder
5.在您的用户类实现编码器接口知道
use FOS\AdvancedEncoderBundle\Security\Encoder\EncoderAwareInterface;
use FOS\UserBundle\Entity\User as BaseUser;
class User extends BaseUser implements EncoderAwareInterface {
...
public function getEncoderName() {
if($this->islegacy()) {
return "legacy_encoder";
}
return NULL;
}
}
记住要添加一个布尔字段来管理,如果用户是遗留用户或不。
就是这样。
我认为最好的解决方案是将所有用户重新导入到'fos_user'表中。由于FOSUserBundle使用SHA1,所以密码一定不是问题。 – Florent 2012-08-20 14:15:19
我认为FOSUserBundle使用sha512 – 2012-08-20 15:20:24
您可以配置编码器工厂使用您最喜欢的散列算法。 – Florent 2012-08-20 15:37:18