FOSUserBundle:自定义密码/从旧DB结构迁移

Con*_*nce 5 passwords md5 database-migration symfony fosuserbundle

我想转移到Symfony2,因为它的现代性和良好的编程给我留下了深刻的印象.

现在我从我的旧系统中获取一个用户表,有10,000个用户,我不想通过让他们设置一个新密码来激怒他们....所以我希望他们能够使用他们的旧密码登录

下面是我的用户表如何看起来像有关登录/注册的3个主要字段的伪代码:

id, int(10) unsigned NOT NULL
username varchar(40) NOT NULL
passhash varchar(32) NOT NULL
secret varchar(20) NOT NULL
Run Code Online (Sandbox Code Playgroud)

注册时,数据以这种方式生成:

$secret = mksecret ();
$passhash = md5 ($secret . $password_formfield . $secret);
Run Code Online (Sandbox Code Playgroud)

登录时,以下列方式检查数据:

if ($row['passhash'] != md5 ($row['secret'] . $password_formfield . $row['secret']))
{
//show login error
}
Run Code Online (Sandbox Code Playgroud)

那么如何在FOSUserBundle中最好地处理它,而不必编辑太多文件?

Kri*_*ith 11

您需要创建自定义密码编码器:

<?php

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

class MyPasswordEncoder extends BasePasswordEncoder
{
    public function encodePassword($raw, $salt)
    {
        return md5($salt.$raw.$salt);
    }

    public function isPasswordValid($encoded, $raw, $salt)
    {
        return $this->comparePasswords($encoded, $this->encodePassword($raw, $salt));
    }
}
Run Code Online (Sandbox Code Playgroud)

并配置它security.yml:

services:
    my_password_encoder:
        class: MyPasswordEncoder

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: { id: my_password_encoder }
Run Code Online (Sandbox Code Playgroud)

只要User::getSalt()退货secretUser::getPassword()退货passhash你就应该好好去.