我有一个旧网站,我想迁移到Symfony2并使用FOSUserBundle。
我的老'网站的数据库存储加密密码如下:
a
但是,我之前没有这样做,也不确定如何去做。我唯一的选择是以某种方式配置FOSUserBundle使用与旧网站相同的加密?如果是这样,我会在哪里这样做?
答案 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
);
}
}