symfony - 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 中更新用户密码的教程,所以我决定更改setPassword
in 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 来编码密码,但问题是passwordEncoder
null,UserPasswordEncoderInterface 服务无法注入到 Admin 实体。
那么用 SonataAdmin 更新用户密码的正确方法是什么
解决方案
我找到了一种破解方式:
创建一个 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);
}
}
但我仍然想知道如何在实体中更改用户密码,它既简单又干燥。
推荐阅读
- crystal-reports-2011 - Crystal Report 循环直到 True 和返回值
- c - volatile 数组上的并发更改是否对所有线程都是原子的且可见的?
- python-3.x - 如何使用通配符在使用 python 的 Outlook 中查找电子邮件?
- c# - 我需要序列化它以保存到文件吗?
- network-programming - 我可以删除 .p4 程序中的数据包负载吗?
- mysql - MYSQL 查询一直超时
- angular - Angular 12 - CORS 阻止了我的请求:请求的资源上不存在“Access-Control-Allow-Origin”标头
- python - 什么是“支持索引”?
- c# - 如何从 C# 运行用 C# 编写的 Selenium/xUnit 测试
- javascript - 如何返回已经被multer filefilter过滤的文件?