<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Symfony中文教程 &#187; password</title>
	<atom:link href="http://www.newlifeclan.com/symfony/archives/tag/password/feed" rel="self" type="application/rss+xml" />
	<link>http://www.newlifeclan.com/symfony</link>
	<description>站在巨人肩膀上的phpweb框架</description>
	<lastBuildDate>Fri, 12 Dec 2025 00:58:27 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>KU案例2之09保存用户</title>
		<link>http://www.newlifeclan.com/symfony/archives/427</link>
		<comments>http://www.newlifeclan.com/symfony/archives/427#comments</comments>
		<pubDate>Wed, 08 Apr 2015 01:58:12 +0000</pubDate>
		<dc:creator><![CDATA[napoleon]]></dc:creator>
				<category><![CDATA[实战教程]]></category>
		<category><![CDATA[password]]></category>

		<guid isPermaLink="false">http://www.newlifeclan.com/symfony/?p=427</guid>
		<description><![CDATA[<p>既然错误已经不存在了，就尝试一下登录吧！等等，我们的用户表还是空的呢。所以不管我们怎们登录都会看到一个错误的密 [&#8230;]</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/symfony/archives/427">KU案例2之09保存用户</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/symfony">Symfony中文教程</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>既然错误已经不存在了，就尝试一下登录吧！等等，我们的用户表还是空的呢。所以不管我们怎们登录都会看到一个错误的密码信息。</p>
<p><span id="more-427"></span></p>
<p>当然这个程序是没有问题的。我们需要添加一些数据：让我们复制loadEvents fixtures 类（LoadEvents.php）到userbundle中，重命名loadUsers，并修改命名空间：</p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/DataFixtures/ORM/LoadUsers.php
namespace Yoda\UserBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Yoda\UserBundle\Entity\User;

class LoadUsers implements FixtureInterface
{
    public function load(ObjectManager $manager)
    {
        // todo
    }
}</pre><p>&nbsp;</p>
<p>保存用户很简单：只要创建一个对象，给他一个username并persist和flush它。最棘手的是password字段，需要用bcrypt加密它：</p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/DataFixtures/ORM/LoadUsers.php
// ...
use Yoda\UserBundle\Entity\User;
// ...

public function load(ObjectManager $manager)
{
    $user = new User();
    $user-&gt;setUsername('darth');
    // todo - fill in this encoded password... ya know... somehow...
    $user-&gt;setPassword('');
    $manager-&gt;persist($user);

    // the queries aren't done until now
    $manager-&gt;flush();
}</pre><p></p>
<h2>ContainerAwareInterface Fixtures</h2>
<p>下面告诉你什么叫酷，symfony给我们提供了一个对象，它能够做所有的编码操作。当然要使用它，首先要实现ContainerAwareInterface:</p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/DataFixtures/ORM/LoadUsers.php
// ...

use Symfony\Component\DependencyInjection\ContainerAwareInterface;

class LoadUsers implements FixtureInterface, ContainerAwareInterface
{
    // …
}</pre><p>这里我们还需要一个setContainer方法。我们还需要存储这个$containser变量到一个新的$container属性：</p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/DataFixtures/ORM/LoadUsers.php
// ...

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class LoadUsers implements FixtureInterface, ContainerAwareInterface
{
    private $container;

    // ...

    public function setContainer(ContainerInterface $container = null)
    {
        $this-&gt;container = $container;
    }
}</pre><p>因为我们实现了这个接口，symfony会在container对象加载load之前调用这个方法。请记住这个container是一个类似于数组的对象，它在系统中持有所有有用的对象。我们可以运行container:debug来看到这个对象的列表：</p><pre class="crayon-plain-tag">php app/console container:debug</pre><p>编译密码</p>
<p>让我们创建一个辅助函数encodePassword去编译你已知的密码！首先，我们问问symfony怎么用一个特殊的“encoder”对象，加密这个密码。我们的bcrypt不是配置在security.yml中吗？是的，我们就是获取它的数据：</p>
<p>之后，我们获得encoder，并调用encodePassword()，他就能帮我们完成所有工作了：</p>
<p><span style="font-size: 12px">symfony2.6写法：</span></p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/DataFixtures/ORM/LoadUsers.php
// ...

private function encodePassword(User $user,$plainPassword)
{
$encoder = $this-&gt;container-&gt;get(‘security.password_encoder’);
return $encoder-&gt;encodePassword($user, $plainPassword);
}</pre><p><span style="font-size: 12px">旧版本写法：</span></p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/DataFixtures/ORM/LoadUsers.php
// ...

private function encodePassword(User $user, $plainPassword)
{
    $encoder = $this-&gt;container-&gt;get('security.encoder_factory')
        -&gt;getEncoder($user)
    ;

    return $encoder-&gt;encodePassword($plainPassword, $user-&gt;getSalt());
}</pre><p>symfony会将明文的密码，还有一个随机串(salt)一起使用bcrypt加密。好的，我们现在调用这个方法来完成密码加密：</p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/DataFixtures/ORM/LoadUsers.php
// ...

public function load(ObjectManager $manager)
{
    $user = new User();
    $user-&gt;setUsername('darth');
    $user-&gt;setPassword($this-&gt;encodePassword($user, 'darthpass'));
    $manager-&gt;persist($user);

    // the queries aren't done until now
    $manager-&gt;flush();
}</pre><p>输入命令行装载数据：</p><pre class="crayon-plain-tag">php app/console doctrine:fixtures:load</pre><p>让我们用命令看看我们的数据：</p><pre class="crayon-plain-tag">php app/console doctrine:query:sql "SELECT * FROM yoda_user"</pre><p>&nbsp;</p><pre class="crayon-plain-tag">array (size=1)
     0 =&gt;
        array (size=3)
          ‘id’ =&gt; string ‘1’ (length=1) ‘username’ =&gt; string ‘user’ (length=4) ‘password’ =&gt; string ‘$2y$13$BoVE3I5dmVkBjRp.l6uwyOI8Z8Ngokiaa.OUUuHoDbGDBdMRMUrmC’ (length=60)</pre><p>太好了，我们已经看到了编译好的密码，其实还有一个随机生成的salt。你每个用户都存储一个salt随机数。那么在symfony中使用getSalt函数调用，这个函数和bcrypt没有关系。</p>
<p>&nbsp;</p>
<p>回到浏览器，我们可以登录了！看看，我们做了些什么呢：</p>
<ol>
<li>传入一个username，从数据库中调用数据并得到一个User Entity；</li>
<li>把明文的密码用bcrypt方式编译</li>
<li>把这个版本的密码和数据库中的密码比对，如果匹配成功，你就可以登录进来了！</li>
</ol>
<p><a rel="nofollow" href="http://www.newlifeclan.com/symfony/archives/427">KU案例2之09保存用户</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/symfony">Symfony中文教程</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.newlifeclan.com/symfony/archives/427/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
