如何将用户密码迁移到Symfony FOSUserBundle表

时间:2015-10-22 16:57:08

标签: symfony passwords fosuserbundle

我有一个旧网站,我想迁移到Symfony2并使用FOSUserBundle。

我的老'网站的数据库存储加密密码如下:

a

但是,我之前没有这样做,也不确定如何去做。我唯一的选择是以某种方式配置FOSUserBundle使用与旧网站相同的加密?如果是这样,我会在哪里这样做?

2 个答案:

答案 0 :(得分:1)

您可以创建自定义密码编码器并覆盖BasePasswordEncoder ::isPasswordValid()在其中添加逻辑

例如

class CustomPasswordEncoder extends BasePasswordEncoder
{
   public function encodePassword($raw,$salt){
       list($salt1,$salt2) = explode(",",$salt);
       return sha1($salt1.$raw.$salt2); // your logic here
   }
    public function isPasswordValid($encoded,$raw,$salt)
    {
      return $this->comparePasswords(
       $encoded,$this>encodePassword($raw,$salt));
    }
}

将此课程设为服务

service.yml
services:
    custom-password-encoder:
        class: path\to\CustomPasswordEncoder

并在security.yml上添加此内容

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: {id: custom-password-encoder}

您还需要更改User::getSalt()以返回以逗号分隔的两个盐

例如

Class User extends BaseUser
{
    public function getSalt()
    {
        return "salt1,salt2";
    }
}

答案 1 :(得分:1)

Magento迁移密码逻辑的代码段。

<?php

namespace AppBundle\Utils;

use Symfony\Component\Security\Core\Encoder\BasePasswordEncoder;

class CustomPasswordEncoder extends BasePasswordEncoder
{
    public function encodePassword($raw, $salt)
    {
        $salt2 = base64_encode($salt.uniqid());

        // logic from magento
        return md5($salt2.$raw).":".$salt2;
    }

    public function isPasswordValid($encoded, $raw, $salt)
    {
        // magento logic
        $hashArr = explode(':', $encoded);
        $hashToValidate = md5($hashArr[1] . $raw);

        return $this->comparePasswords(
           $hashArr[0], // first piece of password
           $hashToValidate // $salt.$password md5 hash
        );
    }
}