我们正在混乱的使用我们的密码字段。现在表达提交纯文本密码,然后再编辑密码并存储。这不是一个好的解决方案,如果我们忘记了加密密码怎么办?明文的密码就会保存到数据库,而不会有任何错误提示。
我们要在User实体里创建一个plainPassword属性。让我们加入getter和setter方法吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
private $plainPassword; // ... public function getPlainPassword() { return $this->plainPassword; } public function setPlainPassword($plainPassword) { $this->plainPassword = $plainPassword; return $this; } |
此属性和其他的一样,但是他没有被保存到数据库。他的作用只是存储临时数据。
使用eraseCredentials
找到eraseCredentials方法并清空plainPassword字段:
1 2 3 4 |
public function eraseCredentials() { $this->setPlainPassword(null); } |
这个方法并不重要,但是他会在身份认证中使用,其目的是确保你的用户没有敏感数据。
使用plainPassword
现在,更新你的form代码-改变password字段为plainPassword:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// src/Yoda/UserBundle/Controller/RegisterController.php // ... public function registerAction(Request $request) { // ... $form = $this->createFormBuilder(...) // ... ->add('plainPassword', 'repeated', array( 'type' => 'password', )) ->getForm() ; // ... } |
不要忘了更新一下模版
1 2 3 4 5 6 7 8 9 10 |
{# src/Yoda/UserBundle/Resources/views/Register/register.html.twig #} {# ... #} {{ form_row(form.plainPassword.first, { 'label': 'Password' }) }} {{ form_row(form.plainPassword.second, { 'label': 'Repeat Password' }) }} |
现在,当我们提交表单时,就会用到User的plainPassword。使用它来实时编译密码属性:
1 2 3 4 |
// inside registerAction() $user->setPassword( $this->encodePassword($user, $user->getPlainPassword()) ); |
让我们来试试吧!注册一个新会员,并尝试登录。