Symfony2: Bearbeiten-Benutzer ohne Passwort
In meiner Anwendung, nur der admin Benutzer erstellen kann und theoretisch Bearbeiten von Benutzern. So weit, nur mithilfe der Symfony security system (keine FOSUserBundle management - Komplexität ist nicht erforderlich), erstellen von Benutzern mit unterschiedlichen Rollen ist es Prima. Die Herausforderung, die völlig entgeht mir ist, wie um einen Benutzer zu Bearbeiten, ohne zu wissen, das Passwort des Benutzers. Ich laufen in den zu erwartenden Fehler bei der überprüfung
Passwort kann nicht leer sein
. Wie kann die Bearbeitung durchgeführt werden? Ich bin sicherlich fehlt etwas sehr grundlegendes hier.
Aktion Bearbeiten:
public function editAction($id) {
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('ManaClientBundle:User')->find($id);
$form = $this->createForm(new UserType(), $user);
return array(
'form' => $form->createView(),
'user' => $user,
'title' => 'Edit user',
);
}
Update-Aktion:
public function updateAction(Request $request, $id) {
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('ManaClientBundle:User')->find($id);
$originalPassword = $user->getPassword();
$form = $this->createForm(new UserType(), $user);
$form->bind($request);
if ($form->isValid()) {
$plainPassword = $form->get('password')->getData();
if (!empty($plainPassword)) {
//encode the password
$encoder = $this->container->get('security.encoder_factory')->getEncoder($entity); //get encoder for hashing pwd later
$tempPassword = $encoder->encodePassword($entity->getPassword(), $entity->getSalt());
$user->setPassword($tempPassword);
}
else {
$user->setPassword($originalPassword);
}
$em->persist($user);
$em->flush();
return $this->redirect($this->generateUrl('user_main', array()));
}
User form:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('enabled', 'choice', array(
'choices' => array('Yes' => 'Yes', 'No' => 'No'),
'expanded' => true,
'multiple' => false,
'label' => 'Enabled: ',
))
->add('fname')
->add('sname')
->add('email')
->add('username')
->add('password', 'repeated', array(
'type' => 'password',
'invalid_message' => 'Password fields do not match',
'first_options' => array('label' => 'Password'),
'second_options' => array('label' => 'Repeat Password'),
))
->add('role', 'choice', array(
'choices' => array('ROLE_USER' => 'User', 'ROLE_ADMIN' => 'Admin'),
'expanded' => true,
'multiple' => false,
'label' => 'Group: ',
))
;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bis ich eine weitere elegante Lösung, hier ist was ich kam mit:
Und Nutzer können jetzt bearbeitet werden, ohne das Passwort!
UserEditType:
Passwort in der User-Entität:
Update-Aktion:
Ich habe das gleiche problem hier in meinem Projekt.
Ich löste es, indem Sie entfernen das Passwort-Feld aus dem Formular nur für meine Aktion Bearbeiten.
So, in meinem
UserController
änderte ich dieeditAction
:Wenn Sie möchten, verwenden Sie die
remove()
Funktion dann bewerben Sie sich auch auf die form festlegen. Zumindest in Symfony 3.3. Auf diese Weise vermeiden Sie, dass die Passwort-Bestätigung angegeben durch@pusle
oben:Hier die ganze Methode in den ProfileController der FOSUserBundle. Es funktioniert für mich:
Nur hinzufügen 'deaktiviert' => 'deaktiviert' und dieses Feld nicht berücksichtigt werden.
class UserEditType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('username', null, array('attr' => array('placeholder' => 'login (min 3 chars)'))) ->add('password', 'password', array('attr' => array('placeholder' => 'min 6 chars'), 'disabled' => 'disabled'))
$user->setPassword($v)
hier aber nur$em->persist($user);
also vielleicht, wenn der Wert ignoriert wird, dann ist es nicht dauerhaft.'disabled' => 'disabled'
. Es gibt mehrere Instanzen, hier ALSO der Nutzer beschreiben den Verlust von Daten beim deaktivieren eines Feldes.'disabled' => 'disabled'
innerhalb derattr
array. Oben Sie zeigen, dass es außerhalb derattr
- array, das würde dann ermöglichen Kennwort beibehalten werden.'disabled' => 'disabled'
außerhalb derattr
array ist, erscheint es nicht als HTML-Attribut. Wenn im inneren, es scheint in den HTML-Code.<input id="user_password" name="user[password]" disabled="disabled" required="required" placeholder="min 6 chars" type="password">
können Sie var_dump $request->Anfrage->alle ( ... ) und Sie werden sehen, dass Passwort ist nicht Teil der Anfrage, so, wenn Sie hatte $Entität "Benutzer" mit Passwort, dann nach form Einreichen, wenn Sie sich nicht ändern, es wird explizit mit setPassword-Methode, es wird nicht geändert werden. Ich denke$form->handleRequest($request);
ist in der Lage, binden Sie nur die Felder, die sind ein Teil der Anforderung. Es sollte klar sein, jetzt für Sie.