Symfony 使用FOSUserBundle更改其他用户的密码

Symfony 使用FOSUserBundle更改其他用户的密码,symfony,fosuserbundle,Symfony,Fosuserbundle,我的系统中有两个角色:用户和管理员。默认情况下,当有人以用户或管理员身份登录时,他可以使用实现的FOSUserBundle表单修改自己的密码。但是我想禁止用户更改他们自己的密码,必须向管理员请求,然后管理员会重置密码,或者引入管理员选择的新密码,或者生成随机密码。我还想向用户发送一封电子邮件,告诉他他的密码已更改,从现在起他必须使用新密码。但我找不到如何做到这一点。有什么帮助吗?您可以通过删除fos\u user\u change\u密码和fos\u user\u重置app/config/rou

我的系统中有两个角色:用户和管理员。默认情况下,当有人以用户或管理员身份登录时,他可以使用实现的FOSUserBundle表单修改自己的密码。但是我想禁止用户更改他们自己的密码,必须向管理员请求,然后管理员会重置密码,或者引入管理员选择的新密码,或者生成随机密码。我还想向用户发送一封电子邮件,告诉他他的密码已更改,从现在起他必须使用新密码。但我找不到如何做到这一点。有什么帮助吗?

您可以通过删除
fos\u user\u change\u密码和
fos\u user\u重置
app/config/routing.yml文件中的路由来阻止用户更改密码。这样,用户和管理员都无法通过
/profile
页面更改自己的密码

然后,您需要创建一个安全控制器操作,允许管理员更改密码和发送电子邮件。为此,您可以使用FOSUserBundle
UserManager
及其
setPlainPassword()
方法

请查看文档:


如果您希望管理员更改其他用户的密码,您可以使用自己的表单:

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username',               TextType::class, array(
                                                    'required' => true,
                                                    'label' => "Username "
                                                    ))
            ->add('email',                  TextType::class, array(
                                                    'required' => true,
                                                    'label' => "Adresse email "
                                                    ))
            ->add('plainPassword',          RepeatedType::class, array(
                                                    'type' => PasswordType::class,
                                                    'options' => array('translation_domain' => 'FOSUserBundle'),
                                                    'first_options' => array('label' => 'form.password'),
                                                    'second_options' => array('label' => 'form.password_confirmation'),
                                                    'invalid_message' => 'fos_user.password.mismatch',
                                                    ))
            ->add('roles',                  ChoiceType::class, array(
                                                    'required' => true,
                                                    'choices' => array('Salarié' => 'ROLE_SALARIE', 'Admin' => 'ROLE_ADMIN'),
                                                    'multiple' => true,
                                                    'expanded'=>true,
                                                    'label' => "Rôle ",
                                                    'label_attr' => array('class' => 'checkbox-inline')
                                                    ))
        ;
    }
//

然后,在控制器中:

public function updateAction(Request $request, Member $user)
{
    $em = $this->getDoctrine()->getManager();

    $form = $this->createEditForm($user);
    $form->handleRequest($request);

    if ($form->isValid()) {
        $userManager = $this->container->get('fos_user.user_manager');
        $userManager->updatePassword($user);
        $em->flush();