首页 > 解决方案 > Symfony 如何使用 SonataAdmin 更改用户密码?

问题描述

我有一个用于登录管理员页面的 Admin 类,它实现了UserInterface

**
 * @ORM\Entity(repositoryClass="App\Repository\AdminRepository")
 */
class Admin implements UserInterface
{
...
}

它是security.yaml中作为用户提供者的实体:

security:
    providers:
        app_user_provider:
            entity:
                class: App\Entity\Admin
                property: username

此管理员提供程序用于在不使用 FOSUserBundle 的情况下登录 SonataAdmin 页面

AdminAdmin在 SonataAdmin 中创建了一个用于更新/创建管理员用户的类:

final class AdminAdmin extends AbstractAdmin
{

}

但是没有关于如何在 SonataAdmin 中更新用户密码的教程,所以我决定更改setPasswordin Admin 实体:

/**
 * @ORM\Entity(repositoryClass="App\Repository\AdminRepository")
 */
class Admin implements UserInterface

{
    public function __construct(UserPasswordEncoderInterface $passwordEncoder)
    {
        $this->passwordEncoder = $passwordEncoder;
    }

    public function setPassword(string $password): self
    {
        dd($this->passwordEncoder);
        $this->password = $this->passwordEncoder->encodePassword($this, $password);

        return $this;
    }
}

看上面,我尝试使用 UserPasswordEncoderInterface 来编码密码,但问题是passwordEncodernull,UserPasswordEncoderInterface 服务无法注入到 Admin 实体。

那么用 SonataAdmin 更新用户密码的正确方法是什么

标签: symfonysonata-admin

解决方案


我找到了一种破解方式:

创建一个 AdminAdminController 扩展 CRUDController,

final class AdminAdminController extends CRUDController
{
    /**
     * @var UserPasswordEncoderInterface
     */
    private $passwordEncode;

    public function __construct(UserPasswordEncoderInterface $passwordEncode)
    {
        $this->passwordEncode = $passwordEncode;
    }


    public function editAction($id = null)
    {
        $existingObject = $this->admin->getObject($id);

        $uniqid = $this->getRequest()->query->get('uniqid');
        $formData = $this->getRequest()->request->get($uniqid);

        if ($formData['password']['first'] ===  $formData['password']['second']){
            $enPass = $this->passwordEncode->encodePassword($existingObject, $formData['password']['first']);
            $formData['password'] = [
                'first' => $enPass,
                'second' => $enPass
            ];
            $this->getRequest()->request->set($uniqid, $formData);
            return parent::editAction($id);
        }else{
            return parent::editAction($id);
        }
    }

但我仍然想知道如何在实体中更改用户密码,它既简单又干燥。


推荐阅读