我正在从ExpressionEngine迁移到Symfony2,并且正在寻找迁移用户密码的最佳方式。目标是让旧用户使用现有凭据登录,而新用户的密码则按默认方式创建。
我已经研究了自定义认证提供者和自定义用户提供者,并考虑是否为旧用户创建单独的实体,但是我不知道实现上述目标的最佳方式/设计。
相关信息:
- 据我所见,ExpressionEngine只是使用SHA1加密密码而已。
- 我当前正在使用FOSUserBundle。
请问有人可以为我提供解决方案吗?
我正在从ExpressionEngine迁移到Symfony2,并且正在寻找迁移用户密码的最佳方式。目标是让旧用户使用现有凭据登录,而新用户的密码则按默认方式创建。
我已经研究了自定义认证提供者和自定义用户提供者,并考虑是否为旧用户创建单独的实体,但是我不知道实现上述目标的最佳方式/设计。
相关信息:
请问有人可以为我提供解决方案吗?
我已经弄清楚了!
创建自定义编码器并使用FOSAdvancedEncoder bundle来选择适当的编码器。
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;
}
}
记得添加一个布尔字段来管理用户是否是遗留用户。
就是这样。
或许从ExpressionEngine导出成员到WordPress的帖子可以帮到你。
我认为唯一的难点就是将自定义查询结果导出到FOSUserBundle结构中。
需要记住的重要事项:
security: encoders: FOS\UserBundle\Model\UserInterface: sha512
更改为正确的哈希值并感到满意,或编写一些自定义代码来处理新用户和旧用户的情况。 - Daniel Ribeiro