在Symfony 4中验证登录表单后没有错误和会话中的用户

时间:2018-05-29 12:43:37

标签: symfony symfony4

我正在尝试在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 %}

我已阅读此问题:How to create a login authentification form with symfony 4

但它并没有解决问题。

如果有人对此有任何了解,我们将非常感谢您的帮助!

干杯。

1 个答案:

答案 0 :(得分:2)

有一个名为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]);
}

修复你的User :: 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;
}

使用此方法无需序列化密码。无论哪种方式似乎工作正常。

相关问题