我正在尝试在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
但它并没有解决问题。
如果有人对此有任何了解,我们将非常感谢您的帮助!
干杯。
答案 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;
}
使用此方法无需序列化密码。无论哪种方式似乎工作正常。