【问题标题】:FOSUserBundle: Custom password / Migration from old DB structureFOSUserBundle:自定义密码/从旧数据库结构迁移
【发布时间】:2012-01-07 17:37:25
【问题描述】:

我想搬到 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 中最好地处理它,而不必编辑太多文件?

【问题讨论】:

    标签: passwords symfony md5 database-migration fosuserbundle


    【解决方案1】:

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

    <?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,你就可以开始了。

    【讨论】:

    • 感谢克里斯,解释得很好。但是我在哪里粘贴我的密码编码器?
    • 你可以把这个类放在你的包中。
    • 好吧,将它放在 Security\Encoder\MyPasswordEncoder.php 下
    【解决方案2】:

    使用 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);
    }
    

    【讨论】:

    • 您使用plainPassword字段设置它,它将由FOSUserBundle或您自己的安全编码器编码。
    • 这仅在您以纯文本密码开头时才有效。如果你从一个编码密码开始,你将有一个双重编码。
    猜你喜欢
    • 2016-05-28
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2012-06-02
    相关资源
    最近更新 更多