0

symfony フォーム ビルダーを使用して通常の登録フォーム (メール + パスワード) を最初に作成しましたが、ユーザーの登録にまったく問題はありませんでした。

いくつかの技術的な問題と戦略的なもののために、symfony フォームビルダーを使用しなくなり、共通の html フォームを作成しました。ユーザー名、ソルト、およびパスワードはデータベースに保存されますが、ログインしようとすると機能しないため、パスワードまたはソルトが間違っています。 symfony フォームビルダー、そうですか?

したがって、もともと symfony フォームビルダーを使用すると、データをエンティティに直接解析できるため、次のようにしました。

    if( 'POST' === $this->getRequest( )->getMethod() ) {
        $form->bindRequest( $this->getRequest( ) );

        if( $form->isValid( ) ) {
            $userSignup = $form->getData( );

             $user = $userSignup->getUser( );

             $user->setPassword( $this->_encodePassword( $user ) );

さて、私は通常の形式を使用しているので:

        if(isset($_GET['user_signup']['user']['username']) && $this->_validemail($_GET['user_signup']['user']['username'])) $username = $_GET['user_signup']['user']['username']; else die('BAD EMAIL');
        if(isset($_GET['user_signup']['user']['password']) && strlen($_GET['user_signup']['user']['password']) >= 5 && strlen($_GET['user_signup']['user']['password']) <= 20)  $password = $_GET['user_signup']['user']['password']; else die('BAD PASSWORD');

        $user = new user();
        $user->setUsername($username);
        $user->setPassword( $this->_encodePassword( $user ) );

encodePassword 関数:

protected function _encodePassword(  User $user )
{
    $factory    = $this->get( 'security.encoder_factory' );
    $encoder    = $factory->getEncoder( $user );
    return      $encoder->encodePassword( $user->getPassword( ), $user->getSalt( ) );
}

私は他の誰かのコードを利用しているので、encodePassword の仕組みを理解するのに苦労しているかもしれません。

4

2 に答える 2

-1

最初にソルトを作成し(ランダム関数を使用)$user->setSalt($salt)、コントローラーで使用する必要があります...

... またはユーザーの__construct()メソッド内でソルトを生成します。

FOSUserBundle は、次を使用して User オブジェクトのコンストラクターでソルトを作成します。

public function __construct()
{
    $this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
    // ...
}

ここを参照してください。

そうしないと、 at と呼ばれるエンコーダーは$this->_encodePassword($user)、ユーザー オブジェクトの getter を呼び出すソルトを見つけられませんgetSalt()


ヒント:

symfony2 では、 ...GETを使用してパラメーターにアクセスしようとしないでください。$_GET

...代わりにRequestオブジェクトを使用してください。

この本のSymfony2 と HTTP Fundamentalsの章を読んでください。

于 2013-06-23T17:17:20.350 に答える