当前位置: 首页 > 知识库问答 >
问题:

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

能逸清
2023-03-14

我试图在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个答案

马宜民
2023-03-14

有一个叫做平等接口的问题导致了这种问题。老实说,我不完全理解它为什么会这样做。但这是身份验证过程中的一些东西,它检查用户是否在请求之间发生了变化。

更新:假设在用户登录时管理员重置了用户密码。如果您没有检查更改的密码,则用户可以继续使用旧密码。由你决定你想要什么样的行为。序列化密码并使用默认的EqualTableInterface实现将强制用户再次登录。

避免此问题的一种方法是序列化密码。

// 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,它应该可以工作。

另一种方法是实现EqualTableInterface

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;
}

使用这种方法,不需要序列化密码。这两种方法似乎都很管用。

 类似资料:
  • 我在Android中开发了一个登录表单。我在这里使用了验证。我必须填写任何人(用户名或密码),然后我的应用程序应该显示成功!并应转移到其他活动。 但是,如果两个字段都为空,则不应显示成功消息,而应显示Login fail!!!。 请帮我这个。 这是我的webservice代码:

  • 错误: TypeError:无法读取未定义的LoginForm c:/reactjs/hello-world/src/components/accountbox/LoginForm.js的属性“state”:23 2023 value={this.state.input.email}^24 onchange={this.handlechange}25 class=“form-control”26

  • 问题内容: 我试图限制用户多次签名(迫使上一个会话过期)。 我检查了这个专题的文件在这里。我将其设置与文档非常相似,但是用户并不仅限于一次会话。我可以使用同一用户多次登录(在不同的浏览器中),并进行多个并发会话。 我认为这是我的安全设置的相关部分。我正在使用自定义UserDetailsS​​ervice,UserDetails和AuthenticationFilter实现。 我还在我的web.xm

  • 问题内容: 我刚刚完成了在PHP中创建整个登录和注册systsem的操作,但是我的问题是我还没有使用任何会话。我是PHP的新手,以前从未使用过会话。我想做的是,在用户注册并填写登录表单后,他们仍将停留在同一页面上。因此,其中一部分将是会话已登录,另一部分将是其他(用户未登录,请显示登录表单)。谁能告诉我如何开始? 问题答案: 希望这可以帮助 :) 开始会话,您需要在页面顶部或在调用会话代码之前说出

  • 我的密码\u散列有问题,当我登录时,我想让用户登录会话,但当我使用密码验证时不工作,回显不返回任何内容。我怎样才能解决这个问题?谢谢这是我的代码: 这个代码完美的工作时,我不使用password_verify。