Включение регистрации электронной почты FOS User Bundle - PullRequest
0 голосов
/ 25 августа 2018

Я купил сторонний php-скрипт и пытаюсь включить подтверждение по электронной почте.Это сделано кем-то другим.Я связался с ними и не получил ответа, я не ищу точного ответа, а просто совет, но я вижу, что есть пакет пользователей FOS в требованиях package.json, а также «RegistrationController.php» в сценарии.Когда пользователь регистрируется, он сразу указывает на страницу «Регистрация прошла успешно» после того, как поля ввода имеют правильный тип данных.

В конфигурации yml я включил подтверждение регистрации, а в файле settings.yml я использовал gmail.в качестве хоста я сделал composer install, но после ввода адреса электронной почты все еще можно перейти на страницу успешной регистрации, а что нет.Я надеялся, что если бы я включил регистрацию в config.yml, что где-то в php, это было бы распознано, но, возможно, это не так, и есть еще какое-то кодирование, которое нужно сделать, это звучит правильно?

RegistrationController.php

/*
 * This file is part of the FOSUserBundle package.
 *
 * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace FOS\UserBundle\Controller;

use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Form\Factory\FactoryInterface;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Model\UserInterface;
use FOS\UserBundle\Model\UserManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

/**
 * Controller managing the registration.
 *
 * @author Thibault Duplessis <thibault.duplessis@gmail.com>
 * @author Christophe Coevoet <stof@notk.org>
 */
class RegistrationController extends Controller
{
    private $eventDispatcher;
    private $formFactory;
    private $userManager;
    private $tokenStorage;

    public function __construct(EventDispatcherInterface $eventDispatcher, FactoryInterface $formFactory, UserManagerInterface $userManager, TokenStorageInterface $tokenStorage)
    {
        $this->eventDispatcher = $eventDispatcher;
        $this->formFactory = $formFactory;
        $this->userManager = $userManager;
        $this->tokenStorage = $tokenStorage;
    }

    /**
     * @param Request $request
     *
     * @return Response
     */
    public function registerAction(Request $request)
    {
        $user = $this->userManager->createUser();
        $user->setEnabled(true);

        $event = new GetResponseUserEvent($user, $request);
        $this->eventDispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);

        if (null !== $event->getResponse()) {
            return $event->getResponse();
        }

        $form = $this->formFactory->createForm();
        $form->setData($user);

        $form->handleRequest($request);

        if ($form->isSubmitted()) {
            if ($form->isValid()) {
                $event = new FormEvent($form, $request);
                $this->eventDispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

                $this->userManager->updateUser($user);

                if (null === $response = $event->getResponse()) {
                    $url = $this->generateUrl('fos_user_registration_confirmed');
                    $response = new RedirectResponse($url);
                }

                $this->eventDispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

                return $response;
            }

            $event = new FormEvent($form, $request);
            $this->eventDispatcher->dispatch(FOSUserEvents::REGISTRATION_FAILURE, $event);

            if (null !== $response = $event->getResponse()) {
                return $response;
            }
        }

        return $this->render('@FOSUser/Registration/register.html.twig', array(
            'form' => $form->createView(),
        ));
    }

    /**
     * Tell the user to check their email provider.
     */
    public function checkEmailAction(Request $request)
    {
        $email = $request->getSession()->get('fos_user_send_confirmation_email/email');

        if (empty($email)) {
            return new RedirectResponse($this->generateUrl('fos_user_registration_register'));
        }

        $request->getSession()->remove('fos_user_send_confirmation_email/email');
        $user = $this->userManager->findUserByEmail($email);

        if (null === $user) {
            return new RedirectResponse($this->container->get('router')->generate('fos_user_security_login'));
        }

        return $this->render('@FOSUser/Registration/check_email.html.twig', array(
            'user' => $user,
        ));
    }

    /**
     * Receive the confirmation token from user email provider, login the user.
     *
     * @param Request $request
     * @param string  $token
     *
     * @return Response
     */
    public function confirmAction(Request $request, $token)
    {
        $userManager = $this->userManager;

        $user = $userManager->findUserByConfirmationToken($token);

        if (null === $user) {
            throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist', $token));
        }

        $user->setConfirmationToken(null);
        $user->setEnabled(true);

        $event = new GetResponseUserEvent($user, $request);
        $this->eventDispatcher->dispatch(FOSUserEvents::REGISTRATION_CONFIRM, $event);

        $userManager->updateUser($user);

        if (null === $response = $event->getResponse()) {
            $url = $this->generateUrl('fos_user_registration_confirmed');
            $response = new RedirectResponse($url);
        }

        $this->eventDispatcher->dispatch(FOSUserEvents::REGISTRATION_CONFIRMED, new FilterUserResponseEvent($user, $request, $response));

        return $response;
    }

    /**
     * Tell the user his account is now confirmed.
     */
    public function confirmedAction(Request $request)
    {
        $user = $this->getUser();
        if (!is_object($user) || !$user instanceof UserInterface) {
            throw new AccessDeniedException('This user does not have access to this section.');
        }

        return $this->render('@FOSUser/Registration/confirmed.html.twig', array(
            'user' => $user,
            'targetUrl' => $this->getTargetUrlFromSession($request->getSession()),
        ));
    }

    /**
     * @return string|null
     */
    private function getTargetUrlFromSession(SessionInterface $session)
    {
        $key = sprintf('_security.%s.target_path', $this->tokenStorage->getToken()->getProviderKey());

        if ($session->has($key)) {
            return $session->get($key);
        }

        return null;
    }
}

Я обнаружил, что проблема с переходом на страницу успеха была из-за того, что он находился в режиме prod, после переключения в режим разработки и включения подтверждения, он, к сожалению, перенаправляется на страницу входа, это не отправка электронного письма и, конечно, страница входа не является желаемым перенаправлением, но я нашел в журнале ошибку, которая, я думаю, может иметь отношение

[2018-08-27 09:29:51] doctrine.DEBUG: "START TRANSACTION" [] []
[2018-08-27 09:29:51] doctrine.DEBUG: INSERT INTO directory_platform_users (username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles, is_verified, created, modified) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) {"1":"dan4","2":"dan4","3":"dan4@gmail.com","4":"dan4@gmail.com","5":false,"6":null,"7":"$2y$13$4.XnFG.PC3Zholme.w4 [...]","8":null,"9":"2R1Z3Qmek2j--loZNXXWcb8TWU [...]","10":null,"11":[],"12":null,"13":"2018-08-27 09:29:51","14":"2018-08-27 09:29:51"} []
[2018-08-27 09:29:51] doctrine.DEBUG: "COMMIT" [] []
[2018-08-27 09:29:51] translation.WARNING: Translation not found. {"id":"Hi,\n\nyour user account has been succesfully created. Your account name is %username% and e-mail account is %email%.","domain":"messages","locale":"en"} []
[2018-08-27 09:29:52] app.ERROR: Exception occurred while flushing email queue: Expected response code 250 but got code "530", with message "530 5.7.0 Must issue a STARTTLS command first. z13-v6sm5400096ioj.51 - gsmtp " [] []
[2018-08-27 09:29:52] request.INFO: Matched route "listing_my". {"route":"listing_my","route_parameters":{"_controller":"DirectoryPlatform\\FrontBundle\\Controller\\ListingController::myAction","_route":"listing_my"},"request_uri":"http://127.0.0.1:8000/account/listings","method":"GET"} []
[2018-08-27 09:29:52] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
[2018-08-27 09:29:52] security.DEBUG: Access denied, the user is not fully authenticated; redirecting to authentication entry point. {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\AccessDeniedException(code: 403): Access Denied. at /home/dan/directory-platform-1.0.8/directory-platform/vendor/symfony/symfony/src/Symfony/Component/Security/Http/Firewall/AccessListener.php:68)"} []
[2018-08-27 09:29:52] security.DEBUG: Calling Authentication entry point. [] []
[2018-08-27 09:29:52] request.INFO: Matched route "fos_user_security_login". {"route":"fos_user_security_login","route_parameters":{"_controller":"fos_user.security.controller:loginAction","_route":"fos_user_security_login"},"request_uri":"http://127.0.0.1:8000/login","method":"GET"} []
[2018-08-27 09:29:52] security.INFO: Populated the TokenStorage with an anonymous Token. [] []

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

Редактировать: я работаю на localhost, поэтому яиспользовал gmail и настроил его таким образом:

Пользователь FOS

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: DirectoryPlatform\AppBundle\Entity\User
    from_email:
        address: me@gmail.com
        sender_name: name
    registration:
      confirmation:
        enabled: true

parameters.yml

mailer_transport: gmail
mailer_host: ~
mailer_user: me@gmail.com
mailer_password: password

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

1 Ответ

0 голосов
/ 30 августа 2018

Это был параметр для fos_user. Я установил его на

config.yml

registration:
  confirmation:
    enabled: true
...