Я использую стандартную защиту Symfony для моего пароля администратора:
security:
providers:
in_memory:
memory:
users:
admin:
password: $2y$12$.QD1HlEVmeupiIIM3d601urQxd.WsgJyfZ0nJjVAyEn2qQOGpjIHi
roles: 'ROLE_ADMIN'
encoders:
Symfony\Component\Security\Core\User\User:
algorithm: bcrypt
cost: 12
Теперь я хотел бы реализовать метод для изменения пароля.
С некоторыми ухищрениями мне удалось получить ответ от этот вопрос к работе по проверке пароля.
Это мой класс паролей:
Я был вынужден использовать public
типа на данный момент, потому что я продолжал получать Не удалось определить тип доступа для свойства ошибка. Дополнительный вопрос, с чего бы это случилось? У меня были сеттеры и геттеры без комментариев
<?php
namespace AppBundle\Security;
use Symfony\Component\Security\Core\Validator\Constraints as SecurityAssert;
use Symfony\Component\Validator\Constraints as Assert;
class ChangePassword
{
/**
* @SecurityAssert\UserPassword(
* message = "Niepoprawne Haslo"* )
*/
public $oldPassword;
/**
* @Assert\Length(
* min = 6,
* minMessage = "Hasło powinno mieć min. 6 znaków"* )
*/
public $newPassword;
// /**
// * Get oldPassword
// *
// * @return string
// */
// public function getOldPassword()
// {
// return $this->oldPassword;
// }
// *
// * Get newPassword
// *
// * @return string
// public function getNewPassword()
// {
// return $this->newPassword;
// }
// public function setNewPassword($newPassword)
// {
// $this->newPassword = $newPassword;
// return $this;
// }
}
Мой тип:
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
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 AppBundle\Security\ChangePassword;class ChangePasswordType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('oldPassword', PasswordType::class, array(
'label' => 'Stare Hasło'))
->add('newPassword', RepeatedType::class, array(
'type' => PasswordType::class,
'invalid_message' => 'Hasła nie pasują do siebie',
'required' => true,
'first_options' => array('label' => 'Nowe Hasło'),
'second_options' => array('label' => 'Wprowadź ponownie'),
))
->add('save', SubmitType::class, array(
'label' => 'Zmień Hasło',
'attr' => array(
'class' => 'btn btn-danger'
)));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Security\ChangePassword',
));
}
public function getName()
{
return 'change_passwd';
}
}
И, наконец, контроллер:
public function adminChangePasswdAction(Request $request)
{
$changePasswordModel = new ChangePassword();
$form = $this->createForm(ChangePasswordType::class, $changePasswordModel);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$user = $this->getUser();
$plainPassword = $form->getData()->newPassword;
$encoder = $this->container->get('security.password_encoder');
$encoded = $encoder->encodePassword($user, $plainPassword);
$user->setPassword($encoded);
//return $this->redirect($this->generateUrl('admin-panel'));
}
return $this->render('admin/changepasswd.html.twig', array(
'form' => $form->createView(),
));
}
Но, как вы можете легко догадаться $user->setPassword($encoded);
часть не работает, потому что пользовательский класс не имеет метода setPassword.
Как правильно установить пароль? Это вообще возможно?
Задача ещё не решена.
Других решений пока нет …