Added form to allow a user to change its own password.

This commit is contained in:
Jan Böhmer 2019-03-15 18:38:45 +01:00
parent 62fe4afd74
commit 1b8b5d927f
3 changed files with 73 additions and 2 deletions

View file

@ -37,8 +37,14 @@ use App\Form\UserSettingsType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Asset\Packages;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\Validator\Constraints\UserPassword;
use Symfony\Component\Validator\Constraints\Length;
class UserController extends AbstractController
{
@ -71,13 +77,19 @@ class UserController extends AbstractController
/**
* @Route("/user/settings", name="user_settings")
*/
public function userSettings(Request $request, EntityManagerInterface $em)
public function userSettings(Request $request, EntityManagerInterface $em, UserPasswordEncoderInterface $passwordEncoder)
{
/**
* @var User
*/
$user = $this->getUser();
//When user change its settings, he should be logged in fully.
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
/***************************
* User settings form
***************************/
$form = $this->createForm(UserSettingsType::class, $user);
@ -89,8 +101,45 @@ class UserController extends AbstractController
$this->addFlash('success', 'user.settings.saved_flash');
}
/*****************************
* Password change form
****************************/
$pw_form = $this->createFormBuilder()
->add('old_password', PasswordType::class, [
'label' => 'user.settings.pw_old.label',
'constraints'=> [new UserPassword()]]) //This constraint checks, if the current user pw was inputted.
->add('new_password', RepeatedType::class, [
'type' => PasswordType::class,
'first_options' => ['label'=> 'user.settings.pw_new.label'],
'second_options' => ['label'=> 'user.settings.pw_confirm.label'],
'invalid_message' => 'password_must_match',
'constraints' => [new Length([
'min' => 6,
'max' => 128
])]
])
->add('submit', SubmitType::class)
->getForm();
$pw_form->handleRequest($request);
//Check if password if everything was correct, then save it to User and DB
if($pw_form->isSubmitted() && $pw_form->isValid()) {
$password = $passwordEncoder->encodePassword($user, $pw_form['new_password']->getData());
$user->setPassword($password);
$em->persist($user);
$em->flush();
$this->addFlash('success', 'user.settings.pw_changed_flash');
}
/******************************
* Output both forms
*****************************/
return $this->render('Users/user_settings.html.twig', [
"settings_form" => $form->createView()
"settings_form" => $form->createView(),
'pw_form' => $pw_form->createView()
]);
}

View file

@ -153,12 +153,18 @@ class User extends NamedDBElement implements UserInterface
/**
* @see UserInterface
* Gets the password hash for this entity.
*/
public function getPassword(): string
{
return (string) $this->password;
}
/**
* Sets the password hash for this user.
* @param string $password
* @return User
*/
public function setPassword(string $password): self
{
$this->password = $password;

View file

@ -37,4 +37,20 @@
{{ form_row(settings_form.reset) }}
{{ form_end(settings_form) }}
{% endblock %}
{% block content %}
{{ parent() }}
<div class="card mt-4">
<div class="card-header">
<i class="fa fa-key fa-fw" aria-hidden="true"></i>
{% trans %}user.settings.change_pw{% endtrans %}
</div>
<div class="card-body">
{{ form_start(pw_form) }}
{{ form_widget(pw_form) }}
{{ form_end(pw_form) }}
</div>
</div>
{% endblock %}