迁移传统用户到Symfony2

15

我正在从ExpressionEngine迁移到Symfony2,并且正在寻找迁移用户密码的最佳方式。目标是让旧用户使用现有凭据登录,而新用户的密码则按默认方式创建。

我已经研究了自定义认证提供者和自定义用户提供者,并考虑是否为旧用户创建单独的实体,但是我不知道实现上述目标的最佳方式/设计。

相关信息:

  • 据我所见,ExpressionEngine只是使用SHA1加密密码而已。
  • 我当前正在使用FOSUserBundle。

请问有人可以为我提供解决方案吗?


我认为FOSUserBundle使用sha512。 - Thomas K
您可以配置编码器工厂以使用您喜欢的哈希算法。 - Florent
编写一个脚本将旧用户导入到新用户表中。 - Florent
1
你不必这样做,只需将sha1配置为密码算法即可。 - Sherlock
好的,但是我更倾向于对新用户使用sha512算法。这就是为什么我想要同时支持两种算法的原因。 - Thomas K
显示剩余3条评论
2个回答

23

我已经弄清楚了!

创建自定义编码器并使用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;
  }

}

记得添加一个布尔字段来管理用户是否是遗留用户。

就是这样。


-2

或许从ExpressionEngine导出成员到WordPress的帖子可以帮到你。

我认为唯一的难点就是将自定义查询结果导出到FOSUserBundle结构中。

需要记住的重要事项:

  • 正如Derek Hogue在该帖子中所指出的那样,用户很可能需要重置密码
  • 你必须非常了解这两种结构,才能正确地导入数据

抱歉,那样做行不通。正如我在问题中所述:“目标是让旧用户使用现有凭据登录,而新用户的密码则按默认方式创建。” - Thomas K
是的,这会起作用。您可以只保留每个密码的哈希值,而无需要求用户重置它们。 - Daniel Ribeiro
我已经测试过了,它行不通。这是因为Symfony基于盐和明文密码的组合来生成哈希密码。而EE只使用sha1哈希变体的明文密码。 - Thomas K
当然它不会像魔法一样自动工作。你是开发者,对吧?为了让它按预期工作,你需要做一些适应性的工作。你可以将 security: encoders: FOS\UserBundle\Model\UserInterface: sha512 更改为正确的哈希值并感到满意,或编写一些自定义代码来处理新用户和旧用户的情况。 - Daniel Ribeiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接