5

私はSymfony2に移行したいと思っています。なぜなら、その現代性と優れたプログラミングに完全に感銘を受けているからです。

現在、10,000人のユーザーがいる古いシステムからusersテーブルを取得していますが、新しいパスワードを設定させて怒らせたくないので、古いパスワードでログインできるようにします。

これは、ログイン/サインアップに関する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でそれを最適に処理するにはどうすればよいですか?

4

2 に答える 2

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()戻ってきて戻っsecretUser::getPassword()くる限り、passhashあなたは行ってもいいはずです。

于 2012-01-08T03:58:27.837 に答える
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);
}
于 2012-01-07T21:21:08.653 に答える