我试图在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创建登录身份验证表单
但这并不能解决问题。
如果有人对此有任何了解,我们将不胜感激!
干杯
有一个叫做平等接口的问题导致了这种问题。老实说,我不完全理解它为什么会这样做。但这是身份验证过程中的一些东西,它检查用户是否在请求之间发生了变化。
更新:假设在用户登录时管理员重置了用户密码。如果您没有检查更改的密码,则用户可以继续使用旧密码。由你决定你想要什么样的行为。序列化密码并使用默认的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
authentication.service.ts:
问题内容: 我试图限制用户多次签名(迫使上一个会话过期)。 我检查了这个专题的文件在这里。我将其设置与文档非常相似,但是用户并不仅限于一次会话。我可以使用同一用户多次登录(在不同的浏览器中),并进行多个并发会话。 我认为这是我的安全设置的相关部分。我正在使用自定义UserDetailsService,UserDetails和AuthenticationFilter实现。 我还在我的web.xm
问题内容: 我刚刚完成了在PHP中创建整个登录和注册systsem的操作,但是我的问题是我还没有使用任何会话。我是PHP的新手,以前从未使用过会话。我想做的是,在用户注册并填写登录表单后,他们仍将停留在同一页面上。因此,其中一部分将是会话已登录,另一部分将是其他(用户未登录,请显示登录表单)。谁能告诉我如何开始? 问题答案: 希望这可以帮助 :) 开始会话,您需要在页面顶部或在调用会话代码之前说出
我的密码\u散列有问题,当我登录时,我想让用户登录会话,但当我使用密码验证时不工作,回显不返回任何内容。我怎样才能解决这个问题?谢谢这是我的代码: 这个代码完美的工作时,我不使用password_verify。