Symfony - Как я могу использовать $ event-> getPasswordToken () для работы? - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь реализовать функцию сброса пароля для уже созданного приложения Symfony 3.4.Я нахожусь в точке, где мне нужно проверить токен пользователя, который был отправлен по электронной почте, и сравнить его с тем, который сохранен в базе данных.Я не могу использовать $ event-> getPasswordToken () в моем коде ...

Контроллер "AppBundle \ Controller \ ResettingController :: resetting ()" требует, чтобы вы указали значение дляаргумент "$ event".Либо аргумент имеет значение NULL, и значение NULL не было предоставлено, значение по умолчанию не было предоставлено, либо после этого есть необязательный аргумент.

<?php 

namespace AppBundle\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Form\FormErrorIterator;
use AppBundle\Entity\User;
use AppBundle\Form\ResettingType;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoder;
use Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator;
use Symfony\Component\Form\FormFactory;
use Symfony\Component\Security\Http\Firewall\ListenerInterface;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Twig\Environment;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use Symfony\Component\Translation\TranslatorInterface;
use AppBundle\Services\Mailer;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use CoopTilleuls\ForgotPasswordBundle\Event\ForgotPasswordEvent;
use CoopTilleuls\ForgotPasswordBundle\Entity\AbstractPasswordToken;
use AppBundle\Event;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;

/**
 * @Route("/password-change")
 */
class ResettingController extends Controller
{

    /**
     * @Route("/{id}/{token}", name="resetting")
     * @param ResettingController $event
     */
    public function resetting(ForgotPasswordEvent $event, User $user, $token, Request $request)
    {

        die($token." -> ".$event->getPasswordToken());

        if ($user->getToken() === null || $token !== $user->getToken())
        {
            $request->getSession()->getFlashBag()->add('error', "Lien d'accès invalide");
            return $this->redirectToRoute('security_login');
        }

        $form = $this->createFormBuilder()
                                            ->add('_password1', PasswordType::class, array("label"=>"Entrez un nouveau mot de passe:"))
                                            ->add('_password2', PasswordType::class, array("label"=>"Retapez ce même mot de passe:"))
                                            ->getForm();
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid())
        {
            $encoder = $this->get('security.password_encoder');
            $password = $encoder->encodePassword($user, $user->getPlainPassword());
            $user->setPassword($password);
            // réinitialisation du token à null pour qu'il ne soit plus réutilisable
            $user->setPasswordToken(null);
            $em = $this->getDoctrine()->getManager();
            $em->persist($user);
            $em->flush();
            $request->getSession()->getFlashBag()->add('success', "Votre mot de passe a été modifié.");
            return $this->redirectToRoute('security_login');
        } 

        return $this->render('Security/change-password.html.twig', [
            'form' => $form->createView(),
            'title' => "Changement de mot de passe",
            'error' => $form->getErrors()
        ]);

    }
}

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

Кристалл возвращает токен в URL, нопуст от токена из базы данных и возвращает эту ошибку.Я пытаюсь заставить $ event работать, чтобы использовать функцию getPasswordToken().

Эта функция в настоящее время используется с sucess в следующем контроллере:

<?php

namespace AppBundle\Event;
use CoopTilleuls\ForgotPasswordBundle\Event\ForgotPasswordEvent;

class ForgotPasswordEventListener
{

    private $templating;
    private $mailer;
    private $manager;

    public function __construct(\Twig_Environment $templating, \Swift_Mailer $mailer, \Doctrine\ORM\EntityManager $manager)
    {
        $this->templating = $templating;
        $this->mailer = $mailer;
        $this->manager=$manager;
    }

    /**
     * @param ForgotPasswordEvent $event
     */
    public function onCreateToken(ForgotPasswordEvent $event)
    {
        $passwordToken = $event->getPasswordToken();
        $user = $passwordToken->getUser();

        $swiftMessage = new \Swift_Message(
            'Reset of your password',
            $this->templating->render(
             'Security/forgot-password.html.twig',
                [
                    'reset_password_url' => sprintf('http://www.quebecenreseau.servlinks.com/intranet/password-change/%s/%s', $user->getId(), $passwordToken->getToken()),
                ]
            )
        );

        $swiftMessage->setFrom('patrick.simard@servlinks.com');
        $swiftMessage->setTo($user->getEmail());
        $swiftMessage->setContentType('text/html');
        if (0 === $this->mailer->send($swiftMessage)) {
            throw new \RuntimeException('Unable to send email');
        }
    }

/*
        public function onUpdatePassword(ForgotPasswordEvent $event)
        {
            $passwordToken = $event->getPasswordToken();
            $user = $passwordToken->getUser();
            $user->setPlainPassword($event->getPassword());
            $this->manager->persist($user);
        }
*/

}

Это мой сервисfile:

# Learn more about services, parameters and containers at
# http://symfony.com/doc/current/book/service_container.html

parameters:
#    parameter_name: value

services:
    app.security.login_form_authenticator:
        class: AppBundle\Security\LoginFormAuthenticator
        autowire: true

    app.doctrine.hash_password_listener:
        class: AppBundle\Doctrine\HashPasswordListener
        autowire: true
        tags:
            - { name: doctrine.event_subscriber }

    app.locale_listener:
        class: AppBundle\EventListener\LocaleListener
        arguments: ['%kernel.default_locale%','@security.authorization_checker']
        tags:
            - { name: kernel.event_subscriber }

    app.login_listener:
        class: AppBundle\EventListener\LoginListener
        arguments: ['@session']
        tags:
            - { name: kernel.event_listener, event: security.interactive_login, method: onInteractiveLogin }

    app.mailer:
        class: AppBundle\Service\Mailer
        arguments: ['@mailer','@templating']

    app.utility:
        class: AppBundle\Service\Utility
        arguments: ['@doctrine.orm.default_entity_manager']

    app.filemanager:
        class: AppBundle\Service\FileManager

    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        arguments: ['@translator.default','@request_stack']
        public: false
        tags:
            - { name: twig.extension }       
    app.sae:
        class: AppBundle\Service\Entity\Sae
        arguments: ['@doctrine.orm.default_entity_manager']

    app.document:
        class: AppBundle\Service\Entity\Document
        arguments: ['@doctrine.orm.default_entity_manager']

    app.professional:
        class: AppBundle\Service\Entity\Professional
        arguments: ['@doctrine.orm.default_entity_manager']

    app.article:
        class: AppBundle\Service\Entity\Article
        arguments: ['@doctrine.orm.default_entity_manager']

    app.course:
        class: AppBundle\Service\Entity\Course
        arguments: ['@doctrine.orm.default_entity_manager']

    app.useraddon:
        class: AppBundle\Service\Entity\UserAddon
        arguments: ['@doctrine.orm.default_entity_manager']

    app.jwt_token_authenticator:
        class: AppBundle\Security\JwtAuthenticator
        arguments: ['@doctrine.orm.entity_manager', '@lexik_jwt_authentication.encoder']

    app.listener.forgot_password:
        class: AppBundle\Event\ForgotPasswordEventListener      
        arguments:
            - "@twig"
            - "@mailer"
            - "@doctrine.orm.entity_manager"
        tags:
            - { name: kernel.event_listener, event: coop_tilleuls_forgot_password.create_token, method: onCreateToken}
            - { name: templating.helper, alias: templating, event: coop_tilleuls_forgot_password.create_token, method: onCreateToken}
            - { name: kernel.event_listener, event: coop_tilleuls_forgot_password.update_password, method: onUpdatePassword }

    app.ResettingController:
        class: AppBundle\Controller\ResettingController
        tags:
            - { name: kernel.event_listener, event: app.ResettingController }


    kernel.event_listener.json_request_transformer:
        class: Qandidate\Common\Symfony\HttpKernel\EventListener\JsonRequestTransformerListener
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 100 }

Токен сохраняется в отдельной таблице следующим образом: enter image description here

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

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

1 Ответ

0 голосов
/ 29 декабря 2018

PasswordToken должен быть атрибутом сущности пользователя.Так что вы можете проверить это в любое время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...