我想转移到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
在注册上,数据以这种方式生成:
$secret = mksecret ();
$passhash = md5 ($secret . $password_formfield . $secret);
在登录上,以下列方式检查数据:
if ($row['passhash'] != md5 ($row['secret'] . $password_formfield . $row['secret']))
{
//show login error
}
那么如何在FOSUserBundle中最好地处理它,而不必编辑太多文件?
答案 0 :(得分: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));
}
}
并在security.yml
中配置:
services:
my_password_encoder:
class: MyPasswordEncoder
security:
encoders:
FOS\UserBundle\Model\UserInterface: { id: my_password_encoder }
只要User::getSalt()
返回secret
而User::getPassword()
返回passhash
,您就应该好了。
答案 1 :(得分:0)
使用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);
}