【问题标题】:From symfony2 form to a simple form users get incorrect password从 symfony2 表单到简单表单,用户得到错误的密码
【发布时间】:2013-06-23 15:38:40
【问题描述】:

最初使用 symfony 表单构建器创建一个普通的注册表单(电子邮件 + 密码),我发现注册我的用户没有任何问题。

对于一些技术问题和战略问题,我不再使用 symfony 表单构建器,我只是制作了一个通用的 html 表单。用户名、salt 和密码保存在数据库中,但是当我尝试登录时它不起作用,所以密码或 salt 是错误的,这让我认为也许 salt 是使用令牌创建的,作为由创建的隐藏字段发送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 的工作原理。

【问题讨论】:

  • 检查盐是否存在并且它在你的 $user->getSalt() 中不为空
  • 您是否在 security.yaml 上检查过您的编码器?您是否使用相同的编码器算法来加密和解密密码?
  • 不使用 symfony2 的表单组件的“战略”原因是什么?!
  • ... 在没有表单构建器的情况下创建 html 表单,在没有请求对象的情况下访问 GET 参数......无论你在这里尝试做什么......你做错了。 thx 对我的回答投了反对票,这可能导致从请求中读取的用户名/密码错误。删除了

标签: symfony


【解决方案1】:

如果您想在您的 Web 应用程序中安装注册系统,请安装 FOSUserBundle

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

【讨论】:

    【解决方案2】:

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

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

    FOSUserBundle 即在 User 对象的构造函数中创建盐:

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

    参考here

    否则在$this-&gt;_encodePassword($user) 调用的编码器将找不到调用用户对象的getter getSalt() 的盐。


    提示:

    在 symfony2 中,你永远不应该尝试使用 $_GET 访问 GET 参数 ...

    ...改用Request 对象。

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

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 2013-05-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 2015-05-18
      • 1970-01-01
      • 2018-11-24
      相关资源
      最近更新 更多