Логин пользователя не работает после обновления пароля

Я пытаюсь сделать функцию забытого пароля в своем приложении Symfony 3.1.

У меня есть форма, отправляющая электронное письмо с URL-адресом для сброса пароля с токеном безопасности. Затем вы попадаете на простую форму, содержащую ввод пароля.

При отправке я обновляю пароль пользователя тем, который они представили, но затем, когда я пытаюсь войти в систему, он говорит, что учетные данные неверны.

Я вижу, что пароль обновляется в базе данных, но я не понимаю, почему он не работает, когда я пытаюсь войти в систему.

Вот код, который обновляет пароль:

// retrieve the user
 $user = $this->getDoctrine()->getRepository("AppBundle:User")->findOneBy(array('username' => "admin", "token" => $token));

//the password posted from the form
$password = $request->get('new_password');

$em      = $this->getDoctrine()->getManager();

//encoding it according to the symfony doc
//see https://symfony.com/doc/3.1/security/password_encoding.html
$encoder = $this->container->get('security.password_encoder');
$encoded = $encoder->encodePassword($user, $password);

//updating the password in the database
$user->setPassword($encoded);
$em->persist($user);
$em->flush();

У меня есть кодировщик, установленный в моем файле security.yaml:

encoders:
    Symfony\Component\Security\Core\User\User:
        algorithm: bcrypt
    AppBundle\Entity\User:
        algorithm: bcrypt

Брандмауэр в security.yaml:

firewalls:
    # disables authentication for assets and the profiler, adapt it according to your needs
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false

    main:
        anonymous: ~
        form_login:
            login_path: /admin/connexion
            check_path: /admin/connexion
        logout:
            path:   /logout
            target: /

Свойство пароля в классе User.php:

/**
 * @var string
 */
private $password;

Поле пароля в config/doctrine/User.orm.xml:

<field name="password" type="string" column="password" length="64"/>

person Ocelot    schedule 14.02.2019    source источник
comment
Какой брандмауэр вы используете для входа в систему (пользовательский?)? Верно ли значение $password (такое же, как введенное в вашей форме)? Каковы аннотации свойства пароля вашей сущности? Чтобы убедиться, что ваш пароль не был изменен за это время: Если вы не вводите свой пароль, совпадает ли значение в базе данных с вашим открытым паролем?   -  person Alex83690    schedule 14.02.2019
comment
Я добавил часть брандмауэров в свой файл security.yaml. $password правильный (содержит пароль, который я ввел в форму) Нет конкретной аннотации для свойства пароля (см. добавленный код) Я не понимаю ваш последний вопрос, вы имеете в виду, если Я ввожу пустой пароль? В этом случае пароль все еще обновляется (выглядит так: $2y$13$.zevhbcGaF8OS.ZhpOJKiuktuOsl5aYgorOiO3M3q7Kqe30m0/N.e)   -  person Ocelot    schedule 14.02.2019
comment
Извините, я перефразирую: если вы измените свой пароль без его кодирования, будет ли его значение в mysql таким же, как в форме?   -  person Alex83690    schedule 14.02.2019
comment
Нет проблем, да, я только что проверил без кодирования пароля, и он был сохранен в базе данных в виде простого текста.   -  person Ocelot    schedule 14.02.2019
comment
Попробуйте выполнить отладку в vendor/symfony/security-core/Encoder/UserPasswordEncoder.php:46, когда вы пытаетесь войти в систему: - $raw должен быть вашим открытым паролем - $user->getPassword() должен быть вашим хешированным паролем - $ encoder-›isPasswordValid($user-›getPassword(), $raw, $user-›getSalt()); должно быть правдой   -  person Alex83690    schedule 14.02.2019
comment
Хорошо, теперь я чувствую себя очень глупо, проблема была в другом: у меня было два провайдера, один для пользователей, поступающих из базы данных, и один для жестко запрограммированного пользователя in_memory, и я забыл создать цепочку провайдеров, как описано здесь: symfony.com/doc/3.1/security/multiple_user_providers.html Мне очень жаль. , Но большое спасибо за ваше (впустую потраченное) время, Алекс!   -  person Ocelot    schedule 14.02.2019


Ответы (1)


Проблема была из-за моих провайдеров: у меня было два провайдера, один для пользователей, поступающих из базы данных, и один для жестко запрограммированного пользователя in_memory, и я забыл создать цепочку провайдеров, как описано здесь: symfony.com/doc/3.1/security/multiple_user_providers.html

person Ocelot    schedule 14.02.2019