Passwords FOSUserBundle:自定义密码/从旧数据库结构迁移
我想搬到Symfony2,因为它的现代性和良好的编程给我留下了深刻的印象 现在我从我的旧系统中获取一个用户表,有10000个用户,我不想让他们设置新密码来激怒他们……所以我希望他们能够使用旧密码登录 以下是my users表的伪代码,其中有3个主要的登录/注册字段:Passwords FOSUserBundle:自定义密码/从旧数据库结构迁移,passwords,symfony,md5,database-migration,fosuserbundle,Passwords,Symfony,Md5,Database Migration,Fosuserbundle,我想搬到Symfony2,因为它的现代性和良好的编程给我留下了深刻的印象 现在我从我的旧系统中获取一个用户表,有10000个用户,我不想让他们设置新密码来激怒他们……所以我希望他们能够使用旧密码登录 以下是my users表的伪代码,其中有3个主要的登录/注册字段: id, int(10) unsigned NOT NULL username varchar(40) NOT NULL passhash varchar(32) NOT NULL secret varchar(20) NOT NUL
id, int(10) unsigned NOT NULL
username varchar(40) NOT NULL
passhash varchar(32) NOT NULL
secret varchar(20) NOT NULL
在注册时,数据通过以下方式生成:
$secret = mksecret ();
$passhash = md5 ($secret . $password_formfield . $secret);
在登录时,通过以下方式检查数据:
if ($row['passhash'] != md5 ($row['secret'] . $password_formfield . $row['secret']))
{
//show login error
}
那么,如何在FOSUserBundle中最好地处理它,而不必编辑太多文件呢 使用FOSUserBundle非常容易。这是它的代码:
$userManager = $this->get('fos_user.user_manager');
foreach ($items as $item) {
$newItem = $userManager->createUser();
//$newItem->setId($item->getObjId());
// FOSUserBundle required fields
$newItem->setUsername($item->getUsername());
$newItem->setEmail($item->getEmail());
$newItem->setPlainPassword($item->getPassword()); // get original password
$newItem->setEnabled(true);
$userManager->updateUser($newItem, true);
}
您需要创建自定义密码编码器:
<?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));
}
}
只要
User::getSalt()
返回secret
和User::getPassword()
返回passhash
,您就可以开始了。您可以使用plainPassword
字段设置它,它将由FOSUserBundle或您自己的安全编码器进行编码。只有在使用纯文本密码开始时,这才有效。如果你从一个编码的密码开始,你将有一个双重编码。谢谢克里斯,解释得很好。但是我应该把我的密码编码器粘贴到哪里呢?你可以把这个类放在你的一个包中。aight会把它放在Security\encoder\MyPasswordEncoder.php下
services:
my_password_encoder:
class: MyPasswordEncoder
security:
encoders:
FOS\UserBundle\Model\UserInterface: { id: my_password_encoder }