从symfony2表单到简单表单,用户输入的密码不正确

时间:2013-06-23 15:38:41

标签: symfony

最初使用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的工作原理。

2 个答案:

答案 0 :(得分:0)

如果您希望在Web应用程序中安装注册系统FOSUserBundle

然后您可以使用userManager创建,注册和编辑任何用户。

答案 1 :(得分:-1)

你应首先创建一个盐(使用一些随机函数)并在你的控制器中使用$user->setSalt($salt) ......

...或在用户的__construct()方法中生成salt。

FOSUserBundle即使用以下方法在User对象的构造函数中创建salt:

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

参考here

否则,$this->_encodePassword($user)处调用的编码器将找不到调用用户对象的getter getSalt()的salt。


提示

在symfony2中,您绝不应尝试使用GET来访问$_GET个参数...

...改为使用Request对象。

请阅读本书的Symfony2 and HTTP Fundamentals章节。