2012-08-17 54 views
15

我正在从expressionengine转移到symfony2,并且正在寻找迁移用户密码的最佳方法。目标是让旧用户使用他们现有的凭证登录,而新用户的密码是以默认方式创建的。将旧用户迁移到symfony2

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

FYI:

  • 据我所看到的,只是expressionengine加密密码 使用SHA1,仅此而已。
  • 我目前使用的是FOSUserBundle。

任何人都可以给我一个解决方案吗?

+0

我认为最好的解决方案是将所有用户重新导入到'fos_user'表中。由于FOSU​​serBundle使用SHA1,所以密码一定不是问题。 – Florent 2012-08-20 14:15:19

+0

我认为FOSUserBundle使用sha512 – 2012-08-20 15:20:24

+0

您可以配置编码器工厂使用您最喜欢的散列算法。 – Florent 2012-08-20 15:37:18

回答

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; 
    } 

} 

记住要添加一个布尔字段来管理,如果用户是遗留用户或不。

就是这样。

+0

似乎对我很好':)' – Florent 2012-08-22 14:39:36

-2

也许线程约exporting members from ExpressionEngine to Wordpress将帮助你。

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

重要的事情要记住:

  • 作为Derek Hogue极大地指出了该线程,用户将最有可能重置其密码
  • 你必须了解这两种结构真的很好为了正确导入数据
+0

对不起,这将无法正常工作。正如我在我的问题中所述:“目标是让旧用户使用他们现有的凭证登录,而新用户的密码是以默认方式创建的。” – 2012-08-22 12:57:31

+0

是的,它会起作用。您可以保留每个密码的散列,而不是要求用户重置它们。 – 2012-08-22 12:59:57

+0

我已经测试过了,它不会。这是因为symfony将哈希密码设置为salt和简单密码的组合。 EE只是使用简单密码的sha1散列变体 – 2012-08-22 13:05:15