0

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

编码密码函数:

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

0

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

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

于 2014-05-22T16:00:16.863 回答
-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 基础章节。

于 2013-06-23T17:17:20.350 回答