使用 Sonata Admin (Symfony 4) 创建用户时如何对密码进行编码?
How to encode password while creating a user with Sonata Admin (Symfony 4)?
我正在尝试在创建用户时使用 Sonata Admin 对 plainPassword
字段进行编码。我没有像 issue 那样使用 FOSUserBundle
。这是我的 UserAdmin
class :
<?php
// src/Admin/UserAdmin.php
namespace App\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Sonata\AdminBundle\Form\Type\ModelType;
use App\Entity\Image;
class UserAdmin extends AbstractAdmin
{
protected function configureFormFields(FormMapper $formMapper) {
$formMapper
->add('username', TextType::class)
->add('email', EmailType::class)
->add('plainPassword', TextType::class)
->add('avatar', ModelType::class, [
'class' => Image::class,
'property' => 'image',
])
;
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper) {
$datagridMapper->add('username')
->add('avatar', null, [], EntityType::class, [
'class' => Image::class,
'choice_label' => 'image',
])
;
}
protected function configureListFields(ListMapper $listMapper) {
$listMapper
->addIdentifier('username')
;
}
我的 services.yaml
包含以下内容:
admin.user:
class: App\Admin\UserAdmin
arguments: [~, App\Entity\User, ~]
tags:
- { name: sonata.admin, manager_type: orm, label: User }
public: true
我不知道是否必须像 example 和 prePersist
方法中那样覆盖 preUpdate
方法。
我的 security.yaml
是这样开始的:
security:
encoders:
App\Entity\User:
algorithm: bcrypt
# https://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
providers:
#in_memory: { memory: ~ }
my_db_provider:
entity:
class: App\Entity\User
密码编码通常在提交(并验证)表单后立即进行。也许您必须在用户控制器 class 的新方法和更新方法中为加密本身复制两行代码,但仅此而已。
我找到了一个解决方案:在 prePersist
方法中编写一些代码。我的 configureFormFields
方法略有改变,但没有任何影响:
protected function configureFormFields(FormMapper $formMapper) {
$formMapper
->add('username', TextType::class)
->add('email', EmailType::class)
->add('plainPassword', RepeatedType::class, array(
'type' => PasswordType::class,
'first_options' => array('label' => 'Password'),
'second_options' => array('label' => 'Password confirmation')
))
->add('avatar', ModelType::class, [
'class' => Image::class,
'property' => 'image',
])
;
}
最后是我的 prePersist
方法:
public function prePersist($object) { // $object is an instance of App\Entity\User as specified in services.yaml
$plainPassword = $object->getPlainPassword();
$container = $this->getConfigurationPool()->getContainer();
$encoder = $container->get('security.password_encoder');
$encoded = $encoder->encodePassword($object, $plainPassword);
$object->setPassword($encoded);
}
我正在尝试在创建用户时使用 Sonata Admin 对 plainPassword
字段进行编码。我没有像 issue 那样使用 FOSUserBundle
。这是我的 UserAdmin
class :
<?php
// src/Admin/UserAdmin.php
namespace App\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Sonata\AdminBundle\Form\Type\ModelType;
use App\Entity\Image;
class UserAdmin extends AbstractAdmin
{
protected function configureFormFields(FormMapper $formMapper) {
$formMapper
->add('username', TextType::class)
->add('email', EmailType::class)
->add('plainPassword', TextType::class)
->add('avatar', ModelType::class, [
'class' => Image::class,
'property' => 'image',
])
;
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper) {
$datagridMapper->add('username')
->add('avatar', null, [], EntityType::class, [
'class' => Image::class,
'choice_label' => 'image',
])
;
}
protected function configureListFields(ListMapper $listMapper) {
$listMapper
->addIdentifier('username')
;
}
我的 services.yaml
包含以下内容:
admin.user:
class: App\Admin\UserAdmin
arguments: [~, App\Entity\User, ~]
tags:
- { name: sonata.admin, manager_type: orm, label: User }
public: true
我不知道是否必须像 example 和 prePersist
方法中那样覆盖 preUpdate
方法。
我的 security.yaml
是这样开始的:
security:
encoders:
App\Entity\User:
algorithm: bcrypt
# https://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
providers:
#in_memory: { memory: ~ }
my_db_provider:
entity:
class: App\Entity\User
密码编码通常在提交(并验证)表单后立即进行。也许您必须在用户控制器 class 的新方法和更新方法中为加密本身复制两行代码,但仅此而已。
我找到了一个解决方案:在 prePersist
方法中编写一些代码。我的 configureFormFields
方法略有改变,但没有任何影响:
protected function configureFormFields(FormMapper $formMapper) {
$formMapper
->add('username', TextType::class)
->add('email', EmailType::class)
->add('plainPassword', RepeatedType::class, array(
'type' => PasswordType::class,
'first_options' => array('label' => 'Password'),
'second_options' => array('label' => 'Password confirmation')
))
->add('avatar', ModelType::class, [
'class' => Image::class,
'property' => 'image',
])
;
}
最后是我的 prePersist
方法:
public function prePersist($object) { // $object is an instance of App\Entity\User as specified in services.yaml
$plainPassword = $object->getPlainPassword();
$container = $this->getConfigurationPool()->getContainer();
$encoder = $container->get('security.password_encoder');
$encoded = $encoder->encodePassword($object, $plainPassword);
$object->setPassword($encoded);
}