Нет ошибки и нет пользователя в сеансе после проверки формы входа в Symfony 4 - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь сделать простую форму входа в Symfony 4 (следуя этой документации: https://symfony.com/doc/current/security/form_login_setup.html).

У меня есть пользователь в базе данных. Если я введу неправильные учетные данные в форме входа, я получу неправильнуюсообщения об ошибках учетных данных. Но если я ввожу правильные учетные данные, меня перенаправляют на дом (поведение по умолчанию), но сеансы не запускаются, пользователь не находится в сеансе.

Это используемый мной SecurityController:

<?php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;

class SecurityController extends Controller
{
    /**
     * @Route("/login", name="login")
     */
    public function login(Request $request, AuthenticationUtils $authenticationUtils)
    {
        $error = $authenticationUtils->getLastAuthenticationError();

        $lastUsername = $authenticationUtils->getLastUsername();

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

Файл security.yaml:

security:
encoders:
    App\Entity\user:
        algorithm: bcrypt

providers:
    in_memory: { memory: ~ }
    quimly_db_provider:
        entity:
            class: App\Entity\User
            property: username

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

    main:
        anonymous: ~

        pattern:    ^/
        http_basic: ~
        provider: quimly_db_provider
        form_login:
            login_path: login
            check_path: login

Веточка:

 {% extends 'base.html.twig' %}

{% block body %}

{% if error %}
    <div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}

<form action="{{ path('login') }}" method="post">
    <label for="username">Username:</label>
    <input type="text" id="username" name="_username" value="{{ last_username }}" />

    <label for="password">Password:</label>
    <input type="password" id="password" name="_password" />

    <button type="submit">login</button>
</form>

{% endblock %}

Я прочитал этот вопрос: Как создать форму аутентификации при входе сsymfony 4

Но это не решает проблему.

Если кто-то знает об этом, помощь будет очень признательна!

Приветствия.

1 Ответ

0 голосов
/ 29 мая 2018

Существует проблема с чем-то, называемым EquatableInterface, которая вызывает такого рода проблемы.Если честно, я не совсем понимаю, почему он делает то, что делает.Но это что-то в процессе аутентификации, которое проверяет, изменился ли пользователь между запросами.

Обновление : Предполагается, что администратор сбрасывает пароль пользователя, когда пользователь вошел в систему. Если выне проверяйте измененный пароль, тогда пользователь может продолжить работу со старым паролем.Вам решать, какое поведение вы хотите.Сериализация пароля и использование реализации EquatableInterface по умолчанию заставит пользователя снова войти в систему.

Один из способов избежать этой проблемы - сериализация пароля.

// App/Entity/User.php
public function serialize()
{
    //die('serialize');
    return serialize(array(
        $this->id,
        $this->username,
        $this->password
    ));
}

public function unserialize( $serialized )
{
    list (
        $this->id,
        $this->username,
        $this->password
        ) = unserialize($serialized, ['allowed_classes' => false]);
}

Исправьте свой пользователь ::getRoles и он должен работать.

Другой подход заключается в реализации EquatableInterface

class User implements UserInterface, \Serializable, EquatableInterface

public function isEqualTo(UserInterface $user)
{
    //if ($this->password !== $user->getPassword()) {
    //    return false;
    //}

    //if ($this->salt !== $user->getSalt()) {
    //    return false;
    //}

    if ($this->username !== $user->getUsername()) {
        return false;
    }

    return true;
}

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

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