【问题标题】:User password not encrypted when using FOSUserBundle + EasyAdminBundle with Symfony 3.4使用 FOSUserBundle + EasyAdminBundle 和 Symfony 3.4 时用户密码未加密
【发布时间】:2018-11-13 15:53:46
【问题描述】:

我将 Symfony 3.4FOSUserBundleEasyAdminBundle 一起使用。

我被以下问题困扰了一段时间:当我通过 EasyAdmin 创建一个新用户时,输入的密码没有经过哈希处理,它在数据库和创建用户的编辑表单中保持清晰(在 EasyAdmin ),而当我通过FOSUserBundle(注册)生成的表单创建用户时没有问题。

我的用户实体

<?php
// src/Repas/UserBundle/Entity/User.php

namespace Repas\UserBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
}

我的 AdminController.php 文件:

<?php
namespace Repas\MenusBundle\Controller;

use EasyCorp\Bundle\EasyAdminBundle\Controller\AdminController as BaseAdminController;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;

class AdminController extends BaseAdminController
{
    public function createNewUserEntity()
    {
        return $this->get('fos_user.user_manager')->createUser();
    }

    public function persistUserEntity($user)
    {
        $this->get('fos_user.user_manager')->updateUser($user, false);
        parent::persistEntity($user);
    }

    public function updateUserEntity($user)
    {
        $this->get('fos_user.user_manager')->updateUser($user, false);
        parent::updateEntity($user);
    }
}

在我的 config.yml 文件中:

easy_admin:
    entities:
        User:
            class: Repas\UserBundle\Entity\User
            export_path: '%kernel.root_dir/../var/export/user'
            password_encoding: { algorithm: 'bcrypt', cost: 12 }

在我的 security.yml 文件中:

encoders:
        Repas\UserBundle\Entity\User: bcrypt

在我的 routing.yml 文件中:

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"
easy_admin_bundle:
    resource: "@RepasMenusBundle/Controller/AdminController.php"
    type:     annotation
    prefix:   /admin

我浏览过许多论坛以及官方文档,我认为我正确地遵循了所有内容,但我确实错过了一些东西。

感谢您的帮助。

【问题讨论】:

    标签: symfony fosuserbundle password-encryption easyadmin


    【解决方案1】:

    EasyAdminBundle 没有定义加密密码的选项,它只提供保存实体(一个 crud)的选项,您可以根据覆盖的 AdminController in order to integrate with FOSUserBundle 内的路由或操作通过 defining custom actions 扩展这些实体。

    例子

    easy_admin:
        entities:
            User:
                list:
                    actions:
                        - { name: 'create_user', type: 'route' } //or nothing on type to use the action option
    

    此时,您已经有一个可通过路由访问的已定义控制器或一个处理指定用户操作的覆盖控制器。您只需要使用 FOSUser 方法正确加密密码,如this doc 中所述。

    希望对你有帮助!

    【讨论】:

    • 感谢您的回答。我已经有一个覆盖控制器(AdminController.php),我已经在其中插入了您链接的文档中提到的 FOSUser 方法。您可以在我在第一篇文章中粘贴的示例代码中看到它。所以我想我已经按照你的建议做了,除非我不明白你的建议;-)
    • 我想我已经找到了上一篇文章中提到的解决方案。我会告诉你的。
    • 是的,我看到了您的控制器,但没有看到将控制器作为路由或操作的简单管理员配置(您的简单管理员配置没有该配置)。这就是我发帖的原因如果你有一个配置文件,请添加它以便给你一个正确的答案
    【解决方案2】:

    好吧,我想我的错误是在 Easyadmin 生成的用于创建新用户的表单中,Easyadmin 生成了一个名为“password”的字段,而不是 FOSUser 用来加密输入密码的“plainPassword”字段。所以我想我只需要在我的“Easyadmin 新用户”表单中创建一个新的“plainPassword”字段并在该字段中输入用户密码来加密它。然后将加密后的密码存储在数据库的“密码”字段中。

    我会告诉你这是否是解决方案。

    【讨论】:

    • 如果您使用 FosUser 并扩展 FOS\UserBundle\Model\User,您已经有一个 plainPassword 字段
    • 是的,但它不会显示在 Easyadmin 表单中。我必须手动添加它。
    猜你喜欢
    • 2018-08-04
    • 2020-06-21
    • 2010-10-23
    • 2016-05-26
    • 2023-03-29
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多