Symfony 4 неверные учетные данные при входе в систему

Изучение Symfony - трудное путешествие, и я знал, что последуют публикации по SO, поэтому вот моя проблема: классическая страница входа, я следовал этот учебник, а до этого я следил за учебником форма регистрации.

Регистрация работает нормально, пользователь вставлен в базу данных с правильной информацией, проблема заключается в входе в систему, потому что независимо от того, что я пробовал, появится сообщение об ошибке Неверные учетные данные, я пробовал с несколькими пользователями, но ничего не могу ' Не нашел ошибку, все вроде правильно, много раз проверял. Итак, пора показать код, я думаю:

Моя форма входа:

<form class = "form-horizontal" role = "form" method = "POST" action = "{{ path('login') }}">
...
...
<input type = "text" name = "_username" class = "form-control" id = "name"
                                   placeholder = "Your username" value = "{{ last_username }}" required autofocus>
...
...
<input type = "password" name = "_password" class = "form-control" id = "password"
                                   placeholder = "Password" required>
                                   <input type = "hidden" name = "_target_path" value = "/admin" />
                                   <input type = "hidden" name = "_csrf_token" value = "{{ csrf_token('authenticate') }}">

Мой контроллер, который обрабатывает логин:

     /**
     * @Route("/login", name = "login")
     * 
     */

    public function login(Request $request, AuthenticationUtils $authenticationUtils)
    {

        // get the login error if there is one
        $error = $authenticationUtils->getLastAuthenticationError();

        // last username entered by the user
        $lastUsername = $authenticationUtils->getLastUsername();

        return $this->render('main/login.html.twig', array(
            'last_username' => $lastUsername,
            'error'         => $error,
        ));
    }

В основном это копипаст из учебника. Я установил кодировку в моем файле security.yalm:

security:
    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    providers:
        the_user_provider:
            entity: 
                class: App\Entity\User
                property: name

    encoders:
        App\Entity\User:
            algorithm: sha512

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: ~

            # activate different ways to authenticate

            # http_basic: true
            # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate

            form_login:
                login_path: login
                check_path: login
                csrf_token_generator: security.csrf.token_manager
            # https://symfony.com/doc/current/security/form_login_setup.html

            provider: the_user_provider

    # Easy way to control access for large sections of your site
    # Note: Only the *first* access control that matches will be used
    access_control:
        - { path: ^/admin, roles: ROLE_USER }
        # - { path: ^/profile, roles: ROLE_USER }

Кроме того, поскольку я не знаю, в чем может быть проблема, вот часть логики регистрации, которая кодирует пароль пользователя:

public function register(Request $request, UserPasswordEncoderInterface $passwordEncoder, Sluggify $sluggify) {
...
...
// 3) Encode the password (you could also do this via Doctrine listener)
            $password = $passwordEncoder->encodePassword($user, $user->getPlainPassword());
            $user->setPassword($password);

И, конечно же, внутри моей сущности Пользователь я уже установил plainPassword и getPlainPassword:

     ...
     ...
     /**
     * @ORM\Column(type = "string", length=64)
     */

     private $password;

     /**
     * @Assert\NotBlank()
     * @Assert\Length(max=4096)
     */
    private $plainPassword;
   ...
   ...

   public function getPlainPassword()
       {
           return $this->plainPassword;
       }

Для завершения вот последние строки в моем файле dev.log:

[2018-03-17 16:35:06] request.INFO: Matched route "login". {"route":"login","route_parameters":{"_controller":"App\\Controller\\MainController::login","_route":"login"},"request_uri":"http://127.0.0.1:8000/login","method":"POST"} []
[2018-03-17 16:35:06] doctrine.DEBUG: SELECT t0.id AS id_1, t0.name AS name_2, t0.email AS email_3, t0.slug AS slug_4, t0.avatar AS avatar_5, t0.password AS password_6, t0.is_author AS is_author_7, t0.is_active AS is_active_8 FROM user t0 WHERE t0.name = ? LIMIT 1 ["K3nzie"] []
[2018-03-17 16:35:06] security.INFO: Authentication request failed. {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException(code: 0): Bad credentials. at /home/k3nzie/projects/symfonyWebsite/vendor/symfony/security/Core/Authentication/Provider/UserAuthenticationProvider.php:88, Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException(code: 0): The presented password is invalid. at /home/k3nzie/projects/symfonyWebsite/vendor/symfony/security/Core/Authentication/Provider/DaoAuthenticationProvider.php:65)"} []
[2018-03-17 16:35:06] security.DEBUG: Authentication failure, redirect triggered. {"failure_path":"login"} []
[2018-03-17 16:35:06] request.INFO: Matched route "login". {"route":"login","route_parameters":{"_controller":"App\\Controller\\MainController::login","_route":"login"},"request_uri":"http://127.0.0.1:8000/login","method":"GET"} []
[2018-03-17 16:35:06] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
[2018-03-17 16:35:07] request.INFO: Matched route "_wdt". {"route":"_wdt","route_parameters":{"_controller":"web_profiler.controller.profiler:toolbarAction","token":"62995d","_route":"_wdt"},"request_uri":"http://127.0.0.1:8000/_wdt/62995d","method":"GET"} []

Какие-либо предложения? Я целый день искал решение, и я уверен, что это глупая ошибка новичка, но все же ... ничего.

Начните с проверки, что у вас включен csrf в framework.yaml: symfony.com/doc/current/security/csrf.html

Cerad 17.03.2018 18:23

Затем в целях безопасности: добавьте «hide_user_not_found: false». Это изменит сообщение об ошибке на «Пользователь не найден» или «неверный пароль» и сузит круг возможных проблем. Я подозреваю, что проблема в кодировке пароля при регистрации. Хотя то, что у вас есть, выглядит правильно. Предполагая, что ваш $ user действительно является App \ Entity \ User, а не пользователем Symfony по умолчанию.

Cerad 17.03.2018 18:30

Вначале я думал, что это тоже связано с кодированием, поэтому я следовал руководству по регистрации, поэтому процесс кодирования выполняется symfony и должен работать нормально (в моей первой попытке я вручную создал первого пользователя и вставил sha512 password) в любом случае попробую то, что вы предложили :)

K3nzie 18.03.2018 10:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
3
3 123
2

Ответы 2

Я столкнулся с той же проблемой. Попробуйте изменить $ user-> getPlainPassword (). Я считаю, что getPlainPassword - это функция конструктора форм, и вы создали свою собственную форму, поэтому вам нужно связать свои переменные с объектом запроса.

В моем коде я сделал это так.

$password = $passwordEncoder->encodePassword($user, $params['password']);

/**
 * @Route("/register", name = "user_registration")
 */
public function registerAction(Request $request, UserPasswordEncoderInterface $passwordEncoder)
{
    $params = $request->request->all();

    if ($request->isMethod("POST")) {
        $user = new User();
        $user->setFname($params["fname"]);
        $user->setLname($params["lname"]);
        $user->setEmail($params["email"]);
        $user->setUsername($params["username"]);
        $user->setCreatedAt(new \DateTime());
        //$user->setPassword($params['password']);

        $password = $passwordEncoder->encodePassword($user, $params['password']);
        $user->setPassword($password);

        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();

        return $this->redirectToRoute('login');

    }

    return $this->render(
        'default/register.html.twig'
    );
}

Посмотрите на проблему в этом фрагменте кода:

/**
 * @ORM\Column(type = "string", length=64)
 */

 private $password;

SHA512 фактически возвращает строку длиной 128. Итак, краткий ответ: ваше поле должно содержать всего 128 символов.

Вы должны установить длину 128 или больше или вообще не задавать, и по умолчанию будет установлено 255

/**
 * @ORM\Column(type = "string")
 */

 private $password;

И после этих изменений вы должны вручную или с помощью миграции исправить длину поля в таблице базы данных.

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