15

我正在从表达式引擎迁移到 symfony2,并且正在寻找迁移用户密码的最佳方法。目标是让旧用户使用其现有凭据登录,而新用户的密码则以默认方式创建。

我查看了自定义身份验证提供程序和自定义用户提供程序,并考虑是否为旧用户创建单独的实体,但我不知道实现上述目标的最佳方式/设计是什么。

供参考:

  • 据我所知,表达式引擎只是使用 sha1 加密密码,仅此而已。
  • 我目前正在使用 FOSUserBundle。

任何人都可以建议我解决方案吗?

4

2 回答 2

23

弄清楚了!

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

}

如果用户是旧用户,请记住添加一个布尔字段来管理。

就是这样。

于 2012-08-22T14:36:49.447 回答
-2

也许关于将成员从 ExpressionEngine 导出到 Wordpress的线程会对您有所帮助。

除了将自定义查询的结果导出到 FOSUserBundle 结构之外,我没有看到任何困难。

要记住的重要事项:

  • 正如Derek Hogue在该线程中指出的那样,用户很可能不得不重置密码
  • 您必须非常了解这两种结构才能正确导入数据
于 2012-08-22T12:32:25.443 回答