Symfony 3: проверка пароля

Я использую этот код для проверки пароля пользователя:

$encoderService = $this->container->get('security.password_encoder');
$match = $encoderService->isPasswordValid($user, $request->query->get('password'));

но он всегда возвращает false, даже если пароль правильный

Вы уверены, что получаете пароль с помощью GET?

J. Almandos 25.10.2018 17:46

да, я подтверждаю получение

Mariam Ait Al 25.10.2018 17:51

Можете ли вы опубликовать весь код контроллера и HTML-код формы? Также имейте в виду, что рекомендуется использовать метод POST для отправки конфиденциальной информации, такой как пароли.

J. Almandos 25.10.2018 17:53

$ .ajax ({url: '{{(path (' setting_acces '))}}', тип: 'GET', dataType: 'json', data: {'password': $ ('# confirmmpassword'). val ()})};

Mariam Ait Al 25.10.2018 17:56

$ encoderService = $ this-> container-> get ('security.password_encoder'); $ match = $ encoderService-> isPasswordValid ($ user, $ request-> query-> get ('password'));

Mariam Ait Al 25.10.2018 17:56

Я думаю, проблема в функции isPasswordValid! автор: я не могу найти проблему

Mariam Ait Al 25.10.2018 18:28

Когда вас попросят опубликовать дополнительный код, вы должны обновить вопрос, используя кнопку редактирования под ним. Код комментария плохо форматируется. Проверьте, какой класс возвращает security.password_encorder. На самом деле существует два интерфейса кодировщика. Обычный и пользовательский. Возможно, вы не получаете реализацию UserPasswordEncorderInterface. Хотя я предполагаю, что проблема в другом.

Cerad 25.10.2018 19:33

он возвращает UserPasswordEncoder

Mariam Ait Al 25.10.2018 20:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
8
950
1

Ответы 1

Вы неправильно используете кодировщик паролей ... Проверьте Документ Symfony по безопасности
Вот пример того, как его использовать.

app/config/security.yml

security:
    encoders:
        AppBundle\Entity\Security:
            algorithm: bcrypt

src/AppBundle/Controller/SecurityController.php

class SecurityController extends Controller {
    private $tokenManager;
    private $encoder;

    public function __construct(CsrfTokenManagerInterface $tokenManager=null, UserPasswordEncoderInterface $encoder) {
        $this->tokenManager=$tokenManager;
        $this->encoder=$encoder;
    }

    **[...]**

    public function editAction(Security $user) {
        if ($user->getOldPassword() !== null && $user->getPlainPassword() !== null && $this->encoder->isPasswordValid($user, $user->getOldPassword())) {
            $user->setPassword($this->encoder->encodePassword($user, $user->getPlainPassword()));
            $em->flush();
        }
    }
}

Form view

<form action = "{{ form.vars.action }}" method = "{{ form.vars.method }}" onsubmit = "event.preventDefault(); ajaxSubmit($(this));">
    <div class = "form-section-title">Change password</div>
    <div class = "form-col-2">
        <div class = "input-field">
            {{ form_label(form.oldPassword, 'Current password') }}
            {{ form_widget(form.oldPassword, { 'attr': {'autocomplete': 'off' }}) }}
        </div>
        <div class = "input-field">
        </div>
    </div>
    <div class = "form-col-2">
        <div class = "input-field">
            {{ form_label(form.plainPassword.first, 'New password') }}
            {{ form_widget(form.plainPassword.first, { 'attr': {'autocomplete': 'off' }}) }}
        </div>
        <div class = "input-field">
            {{ form_label(form.plainPassword.second, 'Repeat new password) }}
            {{ form_widget(form.plainPassword.second, { 'attr': {'autocomplete': 'off' }}) }}
        </div>
    </div>
    <input name = "{{ form._token.vars.full_name }}" type = "hidden" value = "{{ form._token.vars.value }}">
    <div class = "input-field submit-container">
        <button class = "waves-effect waves-light btn btn-2 close_action">Annuler</button>
        <button class = "waves-effect waves-light btn btn-1" type = "submit">Valider</button>
    </div>
</form>

Javascript submit function

function ajaxSubmit(node) {
    $.ajax({
        type: node.attr("method"),
        url: node.attr("action"),
        enctype: 'multipart/form-data',
        data: new FormData(node[0]),
        processData: false,
        contentType: false,
        cache: false
    }).done(function(response, status, xhr) {
        //Your code here
    }).fail(function(request, status, error) {
        console.error(request);
        console.error(status);
        console.error(error);
    });
}

Боковое примечание: должно быть очевидно, но вы должны использовать POST, а не GET с вашим запросом AJAX.

Во-первых, потому что параметры GET ясны как день ... Так менять пароль довольно опасно.

Во-вторых, потому что, как только ваш сайт перейдет на HTTPS, ваши параметры POST будут зашифрованы. Делает действительно трудным читать контент для тех, кто обнюхивает.

И наконец, избегайте размещения кода в комментариях, вместо этого отредактируйте свой вопрос ...;)

Другие вопросы по теме