【问题标题】:enconde password from a form从表单中编码密码
【发布时间】:2017-10-10 16:16:49
【问题描述】:

我是 PHP symfony 的新手,我正在使用 FOSUserbundle,我为用户更改密码创建了一个新视图,但是从 FOSUserBundle 嵌入更改密码表单非常困难,因此我手动创建了一个 html 表单和在视图的控制器中添加一些代码,一切正常,更改密码适用于我的数据库,但问题是密码是明文,我需要它编码(加密),我如何编码我的密码以将其发送到分贝?

这是我的树枝视图中的表单:

<form action="{{path ('fos_user_profile_change_password')}}" method="POST" id="form_user_change_password">                                       
    <div class="form-group">
        <div>
        <label for="fos_user_change_password_form_current_password" class="required">Contraseña actual</label>

        <input type="password" id="fos_user_change_password_form_current_password" name="fos_user_change_password_form[current_password]" required="required">
        </div>

        <div>
        <label for="new_password" class="required">Nueva contraseña</label>
        <input type="password" id="new_password" name="new_password" required="required">
        </div>

        <div>
        <label for="new_password_repeat" class="required">Repita la contraseña</label>
        <input type="password" name="new_password_repeat" id="new_password_repeat" required="required">
        </div>
        <div>

        <input type="submit" value="{{ 'change_password.submit'|trans }}" class="btn btn-primary btn-block uppercase" />
        </div>
    </div>
</form>

这是我的控制器:

/**
 * Change user password.
 *
 * @param Request $request
 *
 * @return Response
 */
public function changePasswordAction(Request $request)
{
    $userManager = $this->get('fos_user.user_manager');       
    $user = $this->getUser();
    $new_password = $_POST['new_password'];
    $user->setPassword($new_password);
    $userManager->updateUser($user);
    $url = $this->generateUrl('fos_user_profile_edit');
    $response = new RedirectResponse($url);

    return $response;
}

我是 PHP 和 Symfony3 的新手 :)

【问题讨论】:

  • 你不需要加密它。您需要对其进行哈希处理。请使用 PHP 的 built-in functionspassword_hash()password_verify())来处理密码安全问题。如果您使用低于 5.5 的 PHP 版本,您可以使用 password_hash() compatibility pack没有必要 escape passwords 或在散列之前对其使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码
  • @GrumpyCrouton - 你注意到他在使用 Symfony 了吗? Symfony 有包含各种散列程序的密码编码器。直接使用password_hash会带来各种乐趣。
  • @Cerad 对不起,我对 Symfony 一点也不熟悉。无论哪种方式,“加密”都不是正确的行为。
  • 您的问题是您没有正确覆盖更改密码模板和/或控制器。看看这些:symfony.com/doc/current/bundles/FOSUserBundle/…symfony.com/doc/current/bundles/FOSUserBundle/… 另外,你能告诉我你在 security.yml 文件中配置了什么编码器吗?
  • 您的 security.yml 是否包含类似:` 编码器:FOS\UserBundle\Model\UserInterface: bcrypt `

标签: php symfony fosuserbundle encode


【解决方案1】:

从上面的 cmets 和代码来看,您似乎只想覆盖 FOSUserBundle 的 change_password_content.html.twig 模板。这将允许您在自己的模板中使用现有的 ChangePassword Form Type 和 ChangePasswordController for FOSUserBundle。

执行此操作的参考在这里:https://symfony.com/doc/current/bundles/FOSUserBundle/overriding_templates.html

为了帮助您了解一些实现细节:

  1. 转到 vendor/friendsofsymfony/user-bundle/Resources/views/ChangePassword/change_password.html.twig 并复制此文件的内容。
  2. 然后转到 app/Resources/views 并创建一个名为 ChangedPassword 的文件夹,并在其中创建一个新文件并粘贴您在上面 (1) 中复制的内容。将文件另存为 change_password.html.twig - 您在步骤 (1) 和 (2) 中所做的就是在 app/Resources/views 中使用您自己的模板覆盖 FOSUserBundle 中的模板。您的覆盖模板的内容与现在的 FOSUserBundle 完全相同。
  3. 现在继续对该覆盖模板进行所需的任何更改:例如更改扩展布局以使用您自己的布局,并在 fos_user_content 块周围添加您可能需要的任何其他标记。保存。

您现在已正确覆盖 FOSUserBundle 模板。如果您需要进一步控制包含表单的内容模板,请继续对名为 change_password_content.html.twig 的模板重复上述操作,并将 change_password.html.twig 模板中的包含更改为 ":ChangePassword/change_password_content.html。树枝”。

以上内容现在意味着 FOSUserBundle 将使用您的覆盖模板而不是捆绑包中的现有模板,让您可以完全控制标记、布局、样式等。

在正确执行上述覆盖时,您无需覆盖 ChangePasswordController - 因此您将通过 FOSUserBundle 中的 UserManager 获得所需的密码哈希。

【讨论】:

  • @CapitanDuke 我很高兴,做得很好。 FOSUserBundle 是最流行和最常用的捆绑软件之一。控制器的覆盖方式类似,您也可以创建自己的 FormTypes,您可以在项目的 config.yml 中进行设置。在这里阅读:symfony.com/doc/current/bundles/FOSUserBundle/index.html。接下来你可能会开始这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多