2 回答
TA贡献1802条经验 获得超10个赞
您必须更改您的防护身份验证器 AppBundle\Security\LoginFormAuthenticator
这向警卫解释您只需要检查登录页面上的凭据
public function supports(Request $request){ return 'login_route' === $request->attributes->get('_route') && $request->isMethod('POST'); }
TA贡献1842条经验 获得超12个赞
我的同事找出了问题所在。实际上上面的代码有很多问题。
使用 GuardAuthenticator 接口已从 sf4 中删除: https://github.com/symfony/symfony/blob/4.4/UPGRADE-4.0.md#security
logout_on_user_change 不是必需的
不需要 LoginFormAuthenticator。
stateless: true 是防火墙中的错误设置,但当我删除它时,它会抛出先前的错误:“无法刷新令牌,因为用户已更改。尝试刷新令牌后,令牌已取消身份验证。” 这件事发生是因为
在 isEqualTo 中我检查了
$this->salt !== $user->getSalt()
但它没有序列化
所以工作解决方案看起来像这样
路由是一样的
后端控制器是相同的
LoginFormAuthentication.php 已删除
安全.yml
security:
encoders:
AppBundle\Entity\User:
algorithm: bcrypt
cost: 12
providers:
user_provider:
entity:
class: AppBundle:User
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false
main:
anonymous: ~
provider: user_provider
form_login:
login_path: app_login
check_path: app_login
default_target_path: app_admin
logout:
path: app_logout
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
用户.php
class User implements UserInterface, \Serializable, EquatableInterface
{
// ..
public function serialize()
{
return serialize(array(
$this->id,
$this->email,
$this->password,
$this->salt,
));
}
public function unserialize($serialized)
{
list (
$this->id,
$this->email,
$this->password,
$this->salt
) = unserialize($serialized, array('allowed_classes' => false));
}
public function isEqualTo(UserInterface $user)
{
if (!$user instanceof User) {
return false;
}
if ($user->getId() == $this->getId()) {
return true;
}
if ($this->password !== $user->getPassword()) {
return false;
}
if ($this->salt !== $user->getSalt()) {
return false;
}
if ($this->email !== $user->getUsername()) {
return false;
}
return true;
}
}
- 2 回答
- 0 关注
- 113 浏览
添加回答
举报