我有2个问题/顾虑
1.当我编辑一个用户时,我不希望总是必须更改用户的密码,我如何更改它?
1.我如何保存数据库中加密的密码,到目前为止,我只成功地在纯文本和没有一个指示,我已经找到是最新的和/或帮助我。
所有其他文件都是通过命令创建的,并且到目前为止未更改。
我使用Symfony 5.2.7和PHP 8.0.6
src/Controller/Admin/AdminCrudController.php
<?php
namespace App\Controller\Admin;
use App\Entity\Admin;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ArrayField;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
class AdminCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Admin::class;
}
public function configureCrud(Crud $crud): Crud
{
return $crud
->setEntityPermission('ROLE_ADMIN')
;
}
public function configureFields(string $pageName): iterable
{
yield TextField::new('username');
yield TextField::new('password')
->hideOnIndex()
->setFormType(PasswordType::class)
;
yield ArrayField::new('roles');
}
}
src/Entity/Admin.php
<?php
namespace App\Entity;
use App\Repository\AdminRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* @ORM\Entity(repositoryClass=AdminRepository::class)
*/
class Admin implements UserInterface
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=180, unique=true)
*/
private $username;
/**
* @ORM\Column(type="json")
*/
private $roles = [];
/**
* @var string The hashed password
* @ORM\Column(type="string")
*/
private $password;
public function __toString(): string
{
return $this->username;
}
public function getId(): ?int
{
return $this->id;
}
/**
* A visual identifier that represents this user.
*
* @see UserInterface
*/
public function getUsername(): string
{
return (string) $this->username;
}
public function setUsername(string $username): self
{
$this->username = $username;
return $this;
}
/**
* @see UserInterface
*/
public function getRoles(): array
{
$roles = $this->roles;
// guarantee every user at least has ROLE_USER
$roles[] = 'ROLE_USER';
return array_unique($roles);
}
public function setRoles(array $roles): self
{
$this->roles = $roles;
return $this;
}
/**
* @see UserInterface
*/
public function getPassword(): string
{
return $this->password;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
/**
* Returning a salt is only needed, if you are not using a modern
* hashing algorithm (e.g. bcrypt or sodium) in your security.yaml.
*
* @see UserInterface
*/
public function getSalt(): ?string
{
return null;
}
/**
* @see UserInterface
*/
public function eraseCredentials()
{
// If you store any temporary, sensitive data on the user, clear it here
// $this->plainPassword = null;
}
}
4条答案
按热度按时间pes8fvy91#
这是我在Symfony 5.4 + EasyAdmin 4 + php 8.1.1上实际使用的。对我来说,编辑用户和新用户操作都很有效。在新用户操作字段中,密码是必需的。在编辑用户操作字段中,密码不是必需的。你可以传递一个空白密码,当前的密码不会被更改。
在User类中,我将password设置为可空:
为了避免出现弃用消息,我还设置了以下内容:
wqsoz72f2#
你有办法吗?
我遇到了同样的问题。我的想法如下
1.当编辑用户时,有一个链接到一个单独的页面/弹出窗口,在那里你可以更改密码。
1.我检查了文档,我认为事件订阅者可能会对密码加密。https://symfony.com/doc/current/bundles/EasyAdminBundle/events.html#event-subscriber-example
deyfvvtc3#
我假设通过UserCrudController是可能的。
EasyAdmin实体操作
您应该将方法重写为:
dddzy1tm4#
我找到了一个适合我的答案,诀窍是使用一个事件监听器,在实体被持久化之前监听。
因此,您需要创建一个如下所示的EventSub:
}
就是这样:)